SpringBoot自动配置原理
一、前言
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
二、原理
1、springboot 的启动类中@SpringBootApplication 里面包含了@EnableAutoConfiguration,就是自动配置的注解。
2、@EnableAutoConfiguration作用:开启自动配置功能。
@EnableAutoConfiguration底层使用@AutoConfigurationPackage+@import注解

(1)、@AutoConfigurationPackage注解,底层使用@import(AutoConfigurationPackages.Registrar.class)注解,导入Registrar到IOC容器,作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包的所有组件扫面到spring 容器里。


(2)、@import(EnableAutoConfigurationImportSelector.class)注解,导入EnableAutoConfigurationImportSelector到IOC容器,目的是为了给容器导入一些组件,其父类AutoConfigurationImportSelector的selectImports方法可导入组件,路径是META-INF/spring.factories下。

List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置,利用SpringFactoriesLoader.loadFactoryNames()扫描所有jar包类路径下 META-INF/spring.factories(找到xxxAutoConfiguration),把扫描到的这些文件的内容包装成properties对象,从properties对象中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中。
3、每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置,自动配置类必须在一定条件下才能生效( @ConditionalOnxxxxxx),举以下几个例子。

实际应用MQ:
@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
三、写在最后
今天是2020年6月15日,北京的疫情形式依旧严峻,小区又恢复了出入测温,出入证检查等政策,炎炎夏日工作人员实属不易,没经历过战争,永远不知道战争的残酷。最后,期待万事终将无恙!