当前位置: 首页 > 后端技术 > Java

SpringBoot核心运行原理的神秘面纱!

时间:2023-04-01 16:10:55 Java

前言你上一次在超市或商场自己开门是什么时候?大多数大型商店都有带传感器的自动门。虽然所有的门都会让你进去,但自动门不需要你推或拉。同样,很多公共场所的厕所都安装了自动感应水龙头。虽然不像超市里的自动门那么受欢迎,但这些设施对你的要求也不高,放水也很轻松。我想这时候你的脑海里有无数的例子,证明设备让现代生活更加自动化和便捷,而不是复杂化和增加障碍。基于“约定优于配置”的原则,SpringBoot将Spring开发的自动化提升到了一个新的高度。那么SpringBoot是如何约定的,又是如何实现自动配置功能的呢?SpringBoot应用SpringBoot初始化我们使用IntelliJIDEA通过Maven初始化一个SpringBoot项目。创建完成后,你会看到类似下图的应用目录结构。主要应用代码位于src/main/java目录下,资源在src/main/resources目录下。pom.xml:Maven构建文档。FsBaseApplication.java:应用程序的引导类,也是Spring主要的配置类。application.yml:用于配置应用程序和SpringBoot的属性。SpringBoot启动类我们在上一篇文章中介绍了四种简单易用的SpringBoot初始化方式。但是无论使用哪种方式,总会生成一个XXXApplication类,如下所示:扫描和自动配置@SpringBootApplicationpublicclassFsBaseApplication{//负责启动bootapplicationpublicstaticvoidmain(String[]args){SpringApplication.run(FsBaseApplication.class,args);}}@SpringBootApplication启用Spring的组件扫描和SpringBoot的自动配置功能。实际上,@SpringBootApplication结合了三个有用的注解。Spring的@Configuration:表示该类使用了Spring基于Java的配置。Spring的@ComponentScan:启用组件扫描,以便您编写的Web控制器类和其他组件可以自动被发现并在Spring应用程序上下文中注册为beans。我们将在本章后面编写一个简单的SpringMVC控制器,用@Controller注释以便组件扫描可以找到它。SpringBoot的@EnableAutoConfiguration:这个不起眼的小注解也可以叫做@Abracadabra,就是这行配置开启了SpringBoot自动配置的魔力,让你不用写一整篇配置。在早期的SpringBoot版本中,需要在FsBaseApplication类上同时标注这三个注解,但是从SpringBoot1.2.0开始,@SpringBootApplication就足够了。下图为@SpringBootApplication注解组合结构关系。自动配置的奥秘SpringBoot的自动配置是一个运行时(更准确地说是应用程序启动时)的过程,在决定应该使用哪些Spring配置,哪些不应该使用之前,会考虑很多因素。SpringBoot自动配置功能运行涉及的几个核心函数有:@EnableAutoConfiguration、springfactories、AutoConfiguration类、@Conditional和各种Starters。整个过程我们一句话描述:SpringBoot通过@EnableAutoConfiguration注解开启自动配置,加载注册在spring.factories中的各种AutoConfiguration类。、配置或Spring容器中是否有Bean等),实例化AutoConfiguration类中定义的Bean(组件等)注入到Spring容器中,完成依赖框架的自动配置。如下图所示:@EnableAutoConfiguration:该注解由组合注解@SpringBootApplication引入,完成自动配置,扫描每个jar包下的spring.factories文件,加载文件中注册的AutoConfiguration类。·spring.factories:配置文件,位于jar包的META-INF目录下,注册AutoConfiguration类,根据指定格式进行自动配置。spring.factories也可以包含其他类型的要注册的类。这个配置文件不仅存在于SpringBoot项目中,也存在于自定义自动配置(或Starter)项目中。AutoConfiguration类:自动配置类,代表SpringBoot中一类名为XXAutoConfiguration的自动配置类。定义了三方组件集成Spring需要初始化的bean和条件。·@Conditional:条件注解及其派生注解用在AutoConfiguration类上,当条件注解满足时,将实例化AutoConfiguration类。·Starters:三方组件的依赖和配置,SpringBoot已经预置的组件。SpringBoot默认的Starters项目往往只包含一个pom依赖项目。如果是自定义的starter,项目还需要包含spring.factories文件,AutoConfiguration类等配置类。小结本文从初始化一个SpringBoot应用开始,一步步走进SpringBoot的核心功能,让你全面了解SpringBoot自动配置的原理和自动配置核心组件的运行过程。只有掌握了这些基本的组件和功能,我们在集成其他三方库的自动配置时,才能更清楚地了解它们使用了哪些自动配置功能。虽然自动配置很方便,但在开发Spring应用程序时,它的某些用法可能有些随意。如果您想要或需要以不同方式配置Spring怎么办?后续文章将介绍如何重写SpringBoot自动配置以实现应用程序的某些目标,以及如何使用类似的技术来配置您自己的应用程序组件。最后一篇为初学者提供学习指南,对从业者有参考价值。我坚信编码员也有能力产生洞察力。扫描下方二维码关注、学习、交流!