Spring @EnableAutoConfiguration
注解执行过程详解
核心流程
- 触发自动配置:通过
@EnableAutoConfiguration
注解开启自动配置。 - 加载配置类:根据
META-INF/spring.factories
文件加载默认的自动配置类。 - 条件判断:每个自动配置类通过
@Conditional
注解判断是否生效。 - Bean 注册:符合条件的配置类会注册对应的 Bean。
代码示例
1. 主启动类(触发自动配置)
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
2. 自动配置类示例(模拟 Spring Boot 内部机制)
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(prefix = "app", name = "enabled", havingValue = "true")
public class MyAutoConfiguration {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
public class CustomCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return System.getenv("CUSTOM_ENV") != null;
}
}
3. 配置文件(application.properties
)
# 激活自动配置
app.enabled=true
4. 测试类
@SpringBootTest
public class DemoApplicationTests {
@Autowired
private MyBean myBean;
@Test
public void testAutoConfiguration() {
assertNotNull(myBean);
}
}
执行过程分步说明
步骤 1:注解触发
@SpringBootApplication
内部包含 @EnableAutoConfiguration
。@EnableAutoConfiguration
通过 @Import(AutoConfigurationImportSelector.class)
引入配置选择器。
步骤 2:加载配置类
-
AutoConfigurationImportSelector
读取 META-INF/spring.factories
文件:
# spring.factories(示例内容)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
-
该文件列出了所有需要加载的自动配置类。
步骤 3:条件判断
- 每个配置类通过
@Conditional
注解判断是否生效:
@ConditionalOnClass(DataSource.class)
:检查类路径是否存在 DataSource
类。@ConditionalOnProperty
:检查配置文件是否设置 app.enabled=true
。- 自定义条件
@Conditional
:如 @Conditional(CustomCondition.class)
。
步骤 4:Bean 注册
- 满足条件的配置类会执行
@Bean
方法,将 Bean 注册到 Spring 容器。
关键类与注解说明
组件 | 作用 | 示例代码 |
---|
@EnableAutoConfiguration | 触发自动配置,加载 spring.factories 中的配置类。 | @SpringBootApplication (包含该注解) |
spring.factories | 配置文件,列出所有需要加载的自动配置类。 | EnableAutoConfiguration=com.example.MyAutoConfiguration |
@Conditional 注解 | 条件判断注解,决定配置类是否生效。 | @ConditionalOnClass , @ConditionalOnProperty , @ConditionalOnMissingBean |
AutoConfigurationImportSelector | 核心选择器,解析 spring.factories 并过滤符合条件的配置类。 | ImportSelector 接口实现类 |
Condition 接口 | 自定义条件判断逻辑(如环境变量、类存在性等)。 | CustomCondition implements Condition |
执行流程图
启动类 @SpringBootApplication
├─ 触发 @EnableAutoConfiguration
│ ├─ 调用 AutoConfigurationImportSelector
│ │ ├─ 读取 META-INF/spring.factories
│ │ │ └─ 加载所有配置类(如 MyAutoConfiguration)
│ │ ├─ 遍历配置类,执行条件判断(@Conditional)
│ │ │ ├─ 若条件满足 → 注册 Bean
│ │ │ └─ 否则 → 跳过
│ │ └─ 返回符合条件的配置类集合
│ └─ 将配置类注册到 Spring 容器
└─ 完成自动配置
总结表格
阶段 | 关键步骤 | 核心组件/注解 |
---|
触发阶段 | 通过 @EnableAutoConfiguration 启动自动配置流程。 | @SpringBootApplication , @EnableAutoConfiguration |
配置加载阶段 | 从 META-INF/spring.factories 文件加载所有配置类。 | spring.factories , AutoConfigurationImportSelector |
条件判断阶段 | 根据 @Conditional 注解过滤符合条件的配置类。 | @ConditionalOnClass , @ConditionalOnProperty , @Conditional |
Bean 注册阶段 | 将符合条件的配置类中的 Bean 注册到 Spring 容器。 | @Configuration , @Bean |
关键点补充
spring.factories
位置:通常位于依赖库的 META-INF
目录下(如 spring-boot-autoconfigure
依赖)。- 条件注解组合:可组合多个
@Conditional
注解,如 @ConditionalOnClass + @ConditionalOnProperty
。 - 禁用自动配置:通过
@EnableAutoConfiguration(exclude = {DisabledConfig.class})
排除特定配置。