什么是SpringBoot自动配置
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类信息加载到 Spring 容器,并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装载进 SpringBoot。
自 Spring Boot 3.0 开始,自动配置包的路径从META-INF/spring.factories 修改为 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。
如何实现自动配置
1. @SpringBootApplication注解
自动配置的起点通常是 @SpringBootApplication 注解,它是一个组合注解,包含了三个重要注解:
@SpringBootConfiguration:标记为一个 Spring 配置类,继承自@Configuration。@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。@ComponentScan:扫描被@Component(@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
其中 @EnableAutoConfiguration 是自动配置的核心。
2. @EnableAutoConfiguration:实现自动装配的核心注解,它也是一个组合注解,其中包含两个注解:
@AutoConfigurationPackage:将标注该注解的类所在的包路径保存到AutoConfigurationPackages中。@Import({AutoConfigurationImportSelector.class}):注解引入了AutoConfigurationImportSelector,这是自动配置的核心处理器。
3. AutoConfigurationImportSelector: 加载自动装配类
该类实现了DeferredImportSelector,重写了getImportGroup方法,返回AutoConfigurationGroup类,后续会走到AutoConfigurationGroup类中的process方法,然后调用getAutoConfigurationEntry方法加载所有自动配置类,其中会经历了一遍筛选,@ConditionalOnXXX 中的所有条件都满足的配置类才会返回。
AutoConfigurationImportSelector的执行时机
通过beanFactory后置处理器执行,refresh -> invokeBeanFactoryPostProcessors -> invokeBeanDefinitionRegistryPostProcessors -> ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry -> processConfigBeanDefinitions -> ConfigurationClassParser.parse -> DeferredImportSelectorHandler.process -> DeferredImportSelectorGroupingHandler.processGroupImports
参考: