Spring Boot自动配置源码解析:从@SpringBootApplication到条件评估的奇幻之旅
Spring Boot自动配置源码解析:从@SpringBootApplication到条件评估的奇幻之旅
你随手写下的
@SpringBootApplication,背后藏着一场精密的条件评估与类加载大戏。
一、开篇:自动配置的三重门
Spring Boot最让人惊叹的能力,就是“自动配置”——你只要引入一个starter,相关的Bean就自动准备好了。但这个过程并不是魔法,而是一套精密的加载-过滤-注册机制。
自动配置的完整流程可以概括为三个阶段:

本文将从源码层面,沿着“入口注解 → 配置加载 → 条件评估”这条主线,带你走完自动配置的全程。
二、第一重门:@SpringBootApplication——一切的起点
2.1 组合注解的奥秘
在任何一个Spring Boot应用中,启动类上都少不了@SpringBootApplication。点击进去,你会发现它其实是一个组合注解:

这三个注解各司其职:
-
@SpringBootConfiguration:本质就是 @Configuration,标识当前类是一个配置类,可以在其中定义@Bean。 -
@ComponentScan:负责扫描启动类所在包及其子包,将业务组件( @Service、@Controller等)注册到容器。 -
@EnableAutoConfiguration:这才是自动配置的总开关,它告诉Spring Boot:“去把所有可能的自动配置类都找来,符合条件的就生效。”
2.2 包扫描的过滤机制
@ComponentScan中有两个特殊的过滤器:
-
TypeExcludeFilter:允许开发者自定义组件过滤逻辑。 -
AutoConfigurationExcludeFilter:专门用于过滤自动配置类,避免它们被 @ComponentScan重复扫描。
这保证了自动配置类的加载由@EnableAutoConfiguration统一管理,不会与业务组件扫描混淆。
三、第二重门:@EnableAutoConfiguration——打开自动配置的开关
3.1 核心源码结构
@EnableAutoConfiguration的源码非常简洁,但它的关键在那一行@Import:
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class) // 核心!public @interfaceEnableAutoConfiguration{// 排除指定的自动配置类 Class<?>[] exclude() default {}; String[] excludeName() default {};}
这里的@Import导入了一个ImportSelector——AutoConfigurationImportSelector。这是自动配置的执行者,所有的加载逻辑都隐藏在这个类里。
3.2 从注解到执行器的调用链

AutoConfigurationImportSelector实现了DeferredImportSelector接口,这意味着它会在所有普通配置类处理完之后才执行——确保自动配置不会干扰用户的自定义配置。
四、第三重门:配置加载——SPI机制的运用
4.1 SpringFactoriesLoader:读取所有候选配置
AutoConfigurationImportSelector的selectImports方法,会调用getAutoConfigurationEntry(),进而通过SpringFactoriesLoader加载所有候选配置类。

spring.factories文件长什么样?
# 位于spring-boot-autoconfigure.jar的META-INF目录下org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\...
这一下子就能加载上百个自动配置类。但这么多配置类,并不是都会生效——接下来就是条件评估的舞台。
4.2 Spring Boot 3.x的变化
从Spring Boot 2.7开始,官方逐步用新的imports文件替代传统的spring.factories:
-
新路径: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports -
新格式:每行一个自动配置类的全限定名 -
优势:加载性能更好,避免旧机制加载大量无关Key的开销
五、第四重门:条件评估——让配置类“择优录取”
5.1 条件注解家族
自动配置类之所以能“智能”,全靠条件注解(@Conditional系列)。常见的包括:
|
|
|
|
|---|---|---|
| @ConditionalOnClass |
|
|
| @ConditionalOnMissingBean |
|
|
| @ConditionalOnProperty |
|
|
| @ConditionalOnWebApplication |
|
|
5.2 条件评估的执行过程
AutoConfigurationImportSelector拿到候选配置类列表后,并不会直接全部注册,而是交给配置类过滤器(ConfigurationClassFilter)进行筛选。

这个过程的核心是条件评估器(ConditionEvaluator),它会根据当前环境(类路径、已有Bean、配置属性等)判断每个条件注解是否成立。
5.3 一个典型的自动配置类
以DataSourceAutoConfiguration为例,看看条件注解如何协同工作:
@Configuration@ConditionalOnClass(DataSource.class) // 类路径必须有DataSource@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置属性publicclassDataSourceAutoConfiguration{@Bean@ConditionalOnMissingBean// 用户没有自定义DataSource时才创建public DataSource dataSource(DataSourceProperties properties){return properties.initializeDataSourceBuilder().build(); }}
这段代码的逻辑非常清晰:
-
@ConditionalOnClass:如果classpath下没有 DataSource类(比如没引入JDBC驱动),整个配置类直接跳过,一了百了。 -
@ConditionalOnMissingBean:如果用户已经自定义了 DataSourceBean,就用用户的;否则才用自动配置创建的。
这就是Spring Boot“用户配置优先”原则的实现。
六、第五重门:属性绑定——让配置可定制
6.1 @ConfigurationProperties的作用
自动配置类不仅创建Bean,还负责从配置文件读取参数。这通过属性绑定实现。
以DataSourceProperties为例:
@ConfigurationProperties(prefix = "spring.datasource")publicclassDataSourceProperties{private String url;private String username;private String password;// getters/setters}
6.2 属性绑定流程

-
配置源聚合: Environment聚合了所有配置源(配置文件、环境变量、命令行参数等)。 -
属性绑定:通过 Binder将spring.datasource前缀下的配置值,绑定到DataSourceProperties对象的对应字段。 -
类型转换:字符串值自动转换成目标类型(如 max-active=10转为Integer)。
七、总结:自动配置的全链路
回顾整个过程,从@SpringBootApplication到条件评估,自动配置的完整链路如下:

核心要点回顾:
-
入口: @SpringBootApplication组合了@EnableAutoConfiguration,开启自动配置。 -
加载: AutoConfigurationImportSelector通过SpringFactoriesLoader扫描spring.factories,获取所有候选配置类。 -
过滤:配置类过滤器评估每个类上的条件注解,只保留满足条件的配置类。 -
注册:生效的配置类被解析,其中的 @Bean方法创建实例并注册到Spring容器。 -
绑定:通过 @ConfigurationProperties将配置文件属性绑定到Bean上。
这套机制的核心设计思想是“约定优于配置”——框架根据约定提供默认行为,同时提供灵活的扩展点,让用户可以按需定制。理解了这些原理,你不仅能轻松应对面试,更能在遇到自动配置相关问题时快速定位根源。
欢迎持续关注,一起探索Spring Boot的底层奥秘。
夜雨聆风