先按 Spring Boot 3.x 的主流实现来讲,并对比一下早期版本的差异。
Spring Boot 自动配置的核心,可以概括成一句话:
Spring Boot 会在启动时,根据类路径里的依赖、当前环境、配置文件以及容器里是否已经存在某些 Bean,动态决定要不要加载某些默认配置类,从而自动帮你创建 Bean。
你可以按下面这套逻辑来理解和面试回答。
一、什么是自动配置
Spring Boot 的自动配置,意思是:
你只要引入了某些 starter 或 jar 包,Spring Boot 就会尝试"按约定"帮你把常用 Bean 配好。
例如类路径里有数据库相关依赖,而且你自己没有手动定义 DataSource,它就会自动配置数据源;如果你自己定义了同名或同类型 Bean,自动配置通常会"退让"。
所以它不是"无脑帮你全配",而是:
- 有条件地生效
- 默认配置
- 用户配置优先
二、自动配置从哪里开始
自动配置的入口,通常是启动类上的:
@SpringBootApplication- 或
@EnableAutoConfiguration
@SpringBootApplication 本身就包含了 @EnableAutoConfiguration,所以大多数项目其实都是通过 @SpringBootApplication 开启自动配置的。官方文档也明确说明,自动配置需要通过这两个注解之一显式启用。
三、自动配置的本质是什么
自动配置的本质其实不是魔法,它底层依然是 Spring 的 @Configuration 配置类机制。
也就是说,Spring Boot 所谓的"自动配置类",本质上就是一批普通的配置类,只不过这些配置类上加了很多条件注解,例如:
@ConditionalOnClass@ConditionalOnMissingBean- 以及其他
@Conditional...注解
官方文档明确指出,自动配置类是标准的配置类,靠额外的条件注解来约束什么时候生效;其中最常见的就是"类路径里有某个类才生效"和"容器里没有用户自定义 Bean 才生效"。
所以你可以理解为:
自动配置 = 配置类 + 条件判断。
四、Spring Boot 怎么找到这些自动配置类
这部分是面试最爱问的。
1. Spring Boot 3.x / 4.x 主流机制
当前官方文档说明,Spring Boot 会在 jar 包中查找:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
这个文件里按行列出所有自动配置类,Spring Boot 启动时会把这些类加载进来作为候选自动配置类。
2. 早期 Spring Boot 2.x 常见机制
较早版本里,自动配置类通常是通过:
META-INF/spring.factories
在 EnableAutoConfiguration 键下进行声明。官方 2.0 文档就是这样描述的。
所以面试里最好这样答:
早期版本主要通过 spring.factories 加载自动配置类,Spring Boot 3.x 以后主流是通过 AutoConfiguration.imports 文件加载。
五、自动配置为什么能"按需生效"
因为每个自动配置类上通常都会加条件注解,只有条件满足才会生效。
最常见的几个条件是:
1. @ConditionalOnClass
只有当类路径里存在某个类时,自动配置才生效。
比如引入了 DispatcherServlet、DataSource、RedisTemplate 等相关类,对应配置才有机会加载。
2. @ConditionalOnMissingBean
只有当 Spring 容器里没有某个 Bean 时,才创建默认 Bean。
这保证了"用户自定义优先于自动配置"。
3. 其他条件
还常见基于配置项、环境、Web 应用类型等条件的注解。
本质都是在启动阶段做一轮"匹配判断",匹配成功才注册 Bean。
六、自动配置的大致执行流程
你可以把它理解成下面 5 步:
- 启动类上的
@SpringBootApplication开启自动配置。 - Spring Boot 去读取自动配置候选文件,找到一批自动配置类;3.x 主要读
AutoConfiguration.imports,早期 2.x 常见是spring.factories。 - 把这些自动配置类当作普通
@Configuration类导入容器。 - 逐个判断这些配置类上的条件注解是否成立,比如类在不在、配置有没有、Bean 是否缺失。
- 条件满足的配置类生效,里面的
@Bean被注册到 Spring 容器中;条件不满足的则跳过。用户自己定义的 Bean 通常会让自动配置"退让"。
七、为什么说"约定大于配置"
因为 Spring Boot 提前把很多常见场景的配置规则写好了:
- 你引入什么依赖
- 环境里有什么类
- 你有没有手动声明 Bean
- 配置文件有没有开启或关闭某功能
它会根据这些约定自动给你配默认值。
你不需要从零开始写大量 XML 或 Java 配置,这就是"约定大于配置"的体现。官方也强调,自动配置是基于你添加到类路径中的 jar 依赖来"尝试自动配置"应用。
八、自动配置和用户配置冲突时怎么办
Spring Boot 的设计原则是:
自动配置是补位,不是强覆盖。
如果你自己定义了配置,比如自己写了一个 DataSource Bean,那么默认的数据源自动配置通常会退让,不再重复创建。官方文档明确给出了这种"用户自定义后自动配置 backs away"的行为。
九、面试回答
Spring Boot 自动配置的原理,本质上是启动时通过 @EnableAutoConfiguration 导入一批自动配置类,这些自动配置类本质上都是普通的 @Configuration 配置类。Spring Boot 会从候选文件中加载这些自动配置类,早期 2.x 常见是 META-INF/spring.factories,3.x 以后主流是 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。加载后,再结合 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解进行判断,只有在类路径、配置环境、Bean 状态等条件满足时,才会把对应 Bean 注册到容器中。如果用户已经自己定义了 Bean,自动配置通常会退让。因此自动配置的核心就是:候选配置类加载 + 条件装配 + 用户配置优先。
十、一句话总结
Spring Boot 自动配置就是:启动时加载一批预定义的配置类,再根据类路径、配置项和容器现状做条件判断,满足条件就自动注册 Bean,不满足就跳过,且用户自定义配置优先。