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容器中,实现自动配置功能。