Spring Boot 自动装配原理源码解析
从 @SpringBootApplication 出发,逐层拆解自动装配的加载流程,理解条件装配的设计精妙之处。

Spring Boot 最迷人的地方在于"约定优于配置",而这一切的核心机制就是自动装配。理解自动装配原理,不仅能帮你在面试中从容应对源码追问,也能让你在实际项目中更好地排查"为什么这个 Bean 没有生效"这类问题。
一、入口:@EnableAutoConfiguration
@SpringBootApplication 是一个组合注解,其中 @EnableAutoConfiguration 是自动装配的真正入口。它通过 @Import(AutoConfigurationImportSelector.class) 引入了一个延迟装配的选择器。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY =
"spring.boot.enableautoconfiguration";
}二、自动配置类如何被发现
Spring Boot 2.7 之前依赖 META-INF/spring.factories 文件声明自动配置类,2.7 之后逐步迁移到 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件。加载后的配置类列表会经过去重、排序、条件过滤等多个步骤。
- 通过 SpringFactoriesLoader 加载候选自动配置类全限定名列表
- 使用 @AutoConfigureOrder / @AutoConfigureAfter 等注解决定加载顺序
- 条件注解(@ConditionalOnClass、@ConditionalOnMissingBean 等)在此阶段完成过滤
三、条件装配的设计精妙之处
条件注解的底层依赖 Condition 接口与 ConditionEvaluator,在 Bean 定义注册阶段进行匹配判断。@ConditionalOnMissingBean 使得用户自定义的 Bean 总能覆盖自动配置提供的默认 Bean,这正是"约定优于配置,但配置优先于约定"的体现。
理解 @ConditionalOnMissingBean 的加载时机,你就能理解为什么自定义的 DataSource 总能"顶掉"默认的自动配置数据源。
四、常见面试追问
- 自动配置类的加载顺序是如何保证的?
- 如何自己写一个 Starter 并实现自动装配?
- spring.factories 和 AutoConfiguration.imports 文件有什么区别?



