Java四十四篇:springboot 的自动装配
程序入口

由springboot的自动配置原理,其入口是@SpringBootApplication注解

SpringBootApplication注解其实是SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解的组合;
SpringBootConfiguration可以理解为Spring版的Configuration注解;
EnableAutoConfiguration:这是SpringBoot自动配置的入口里面有两个关键点

**@AutoConfigurationPackage:**设置SpringBoot自动扫描包点路径,当basePackages或basePackageClasses属性没有指定包扫描路径时默认从启动类所在当包开始扫描;
**@Import(AutoConfigurationImportSelector.class:**通过Import注解向Spring容器中注入一个类为AutoConfigurationImportSelector的bean,AutoConfigurationImportSelector实现了DeferredImportSelector类,该类中的getAutoConfigurationEntry方法中会将spring-boot-autoconfigure包下Resource/META-INF/spring.factories文件中以EnableAutoConfiguration为key值的所有配置类读取并筛选出来,这里面的类都是配置类,和我们自己写的以@Configuration标注的配置类作用相同,这里面基本包含了目前常用的组件配置。
解释
1.Springboot启动后,读取程序的启动类时,就会读取到@SpringBootApplication
2.@SpringBootApplication注解又包含了 @EnableAutoConfiguration注解
3.@EnableAutoConfiguration
注解导入了AutoConfigurationImportSelector类,
4.@AutoConfigurationPackage :自动配置包
5.AutoConfigurationImportSelector.class中,定义了一个方法getCandidateConfigurations,进入getCandidateConfigurations方法,getCandidateConfigurations会到classpath下的读取META-INF/spring.factories文件的配置
6.spring.factories文件在spring-boot-autoconfigure-2.3.7.RELEASE.jar的META-INF中,spring.factories文件中声明了很多java配置类,但是每个配置类都是需要满足一定的条件才会执行(例如: @ConditionalOnClass 、 @ConditionalOnProperty、 @ConditionalOnMissingBean等)

7.随便打开一个自动配置文件,比如说WebMvcAutoConfiguration.class
从WebMvcAutoConfiguration
这个类中使用的注解可以看出,要完成自动配置是有依赖条件的。
这些是springboot特有的,常见的条件依赖注解有:
@ConditionalOnSingleCandidate,仅在当前上下文中存在某个bean时,才会实例化这个Bean。
@ConditionalOnClass,某个class位于类路径上,才会实例化这个Bean。
@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。
@ConditionalOnMissingBean,仅在当前上下文中不存在某个bean时,才会实例化这个Bean。
@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。
@ConditionalOnNotWebApplication,不是web应用时才会实例化这个Bean。
@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。
@AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean。
所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。
总结
1、@Configuration&与@Bean->基于java代码的bean配置
2、@Conditional->设置自动配置条件依赖
3、@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
4、@EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。
5、@EnableAutoConfiguration自动配置从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
springboot启动加载所有的配置类(127个),按需加载所需配置类。
