SpringBoot 自动装配流程
Spring Boot 的自动装配(Auto Configuration)是其最核心的特性之一,它让你能“开箱即用”,极大简化了配置。下面是 Spring Boot 自动装配的整体流程(从启动到生效) 的详细解析:
✅ 一、整体流程概览
@SpringBootApplication↓
@EnableAutoConfiguration↓
@Import(AutoConfigurationImportSelector)↓
读取 META-INF/spring.factories 或 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports↓
筛选出符合条件的配置类(@Conditional 系列注解)↓
通过 IOC 容器进行配置类的实例化(@Bean 等生效)
✅ 二、核心注解与机制
1. @SpringBootApplication
这是一个复合注解,相当于:
@Configuration
@EnableAutoConfiguration
@ComponentScan
重点是其中的 @EnableAutoConfiguration
。
2. @EnableAutoConfiguration
这个注解的作用是:启用 Spring Boot 的自动配置功能。
它的关键点是使用了:
@Import(AutoConfigurationImportSelector.class)
3. AutoConfigurationImportSelector
这是自动装配的“入口类”。它做的事包括:
- 从类路径下
META-INF/spring.factories
(Spring Boot 2.x) 或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(Spring Boot 3.x) 中读取所有自动配置类; - 然后筛选出条件满足的类(使用
@Conditional
相关注解); - 最终将这些配置类注入 Spring 容器中。
✅ 三、自动装配背后的几个关键文件
1. META-INF/spring.factories
(Spring Boot 2)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.ClassA,\
com.example.autoconfig.ClassB
2. Spring Boot 3 使用 spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
这是 Spring Boot 3.x 引入的新方式(为提高性能和模块粒度)。
✅ 四、常见的条件注解(决定是否装配)
注解 | 含义 |
---|---|
@ConditionalOnClass | 某个类存在时才装配 |
@ConditionalOnMissingBean | Spring 容器中没有某个 bean 时才装配 |
@ConditionalOnProperty | 配置文件中有指定属性或值时才装配 |
@ConditionalOnBean | 有某个 Bean 存在时才装配 |
@ConditionalOnWebApplication | 是 Web 环境才装配 |
这些注解让自动装配具备条件性和灵活性,防止误装配。
✅ 五、自动装配类里一般做了什么?
- 标注为
@Configuration
; - 声明
@Bean
方法; - 使用条件注解控制 bean 是否创建;
- 利用
@Conditional
注解动态判断配置是否注入; - 读取 application.properties 中的配置,通过
@ConfigurationProperties
自动绑定。
✅ 六、如何排查和定制自动装配
- 排查某个类是否被自动装配:使用
spring-boot-actuator
提供的/actuator/conditions
。 - 定制自动装配:可以写自己的自动配置类,注册到
spring.factories
。 - 排除默认装配:使用
@SpringBootApplication(exclude = XxxAutoConfiguration.class)
。
✅ 七、总结一句话:
Spring Boot 自动装配通过
@EnableAutoConfiguration
,配合AutoConfigurationImportSelector
动态加载并实例化一批配置类,它们通常带有条件注解,控制是否向容器中注入默认的 Bean。