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})
排除特定配置。