SpringBoot自动配置原理
@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有三个重要注解,分别是@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。
- ①@SpringBootConfiguration代表当前类是一个配置类。
②@ComponentScan代表自动扫描并向ioc容器导入组件,即自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。可以通过basePackages等属性来细粒度地定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
③@EnableAutoConfiguration也是一个合成注解,其包含两个重要注解@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})。
①@AutoConfigurationPackage是自动配置包注解,它的作用是注册当前主程序类的同级以及子级的包中的符合条件(如@Configuration)的Bean的定义。其原理是给容器中导入一个Registrar组件,从而间接利用Registrar将主配置类(@SpringBootConfiguration标注的类)所在的包及其下面所有子包里面符合条件的组件扫描到IOC容器中,所以默认情况下主配置类所在包及其子包以外的组件,Spring IOC容器是扫描不到的。
②@Import(AutoConfigurationImportSelector.class)注解将AutoConfigurationImportSelector类导入到容器中,此类的selectImports()调用getAutoConfigurationEntry()给容器中批量导入一些组件。
getAutoConfigurationEntry()通过调用getCandidateConfigurations()获取到所有需要导入到容器中的配置类。虽然所有配置类在启动的时候默认全部加载(xxxxAutoConfiguration),但最终会按照条件装配规则(@Conditional)进行按需配置。
getCandidateConfigurations()会调用SpringFactoriesLoader.loadFactoryNames()–>loadSpringFactories()查找classpath上所有jar包中的META-INF/spring.factories进行加载,从而得到各个组件。
以spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面的META-INF/spring.factories为例:
总结
- SpringBoot先加载所有的自动配置类xxxxxAutoConfiguration。
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定。
- 定制化配置
- 用户直接自己@Bean替换底层的组件。
- 用户去看这个组件是获取的配置文件什么值就去修改。
- SpringBoot启动流程:
- Spring Boot项目的启动注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:
- @SpringBootConfiguration:代表当前类是一个配置类。
- @ComponentScan:代表自动扫描并向ioc容器导入组件,即自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
- @EnableAutoConfiguration:包含两个重要注解@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})。
- @AutoConfigurationPackage:将Registrar类导入到容器中,而Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到springboot创建管理的容器中。
- @Import(AutoConfigurationImportSelector.class):导入了AutoConfigurationlmportSelector,在该类中加载META-INF/spring.factories的配置信息。然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能。
- Spring Boot项目的启动注解是:@SpringBootApplication,其实它就是由下面三个注解组成的: