Spring Boot 3.x 相比于 2.x,在自动配置(Auto-Configuration)的注册与发现机制上发生了重大变化。这是升级过程中最需要注意的破坏性更新(Breaking Change)之一,特别是对于自定义 Starter 的开发者而言。
1. Spring Boot 2.x 的注册机制:spring.factories
在 Spring Boot 2.x(以及更早版本)中,自动配置类的注册依赖于 Spring Framework 的 SpringFactoriesLoader 机制。

- 配置文件路径 :
src/main/resources/META-INF/spring.factories - 文件格式:Properties 格式(Key-Value)。
- 配置方式 :使用
org.springframework.boot.autoconfigure.EnableAutoConfiguration作为 Key,配置类全限定名作为 Value(多个类用逗号分隔)。
示例代码:
文件:META-INF/spring.factories
properties
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.project.autoconfigure.MyFirstAutoConfiguration,\
com.example.project.autoconfigure.MySecondAutoConfiguration
2. Spring Boot 3.x 的注册机制:SPI 规范化
Spring Boot 2.7 引入了一种新的自动配置注册方式,并在 Spring Boot 3.0 中彻底移除 了对 spring.factories 中自动配置项的支持。新的机制采用了更加标准的 SPI(Service Provider Interface)风格,目录结构更清晰。
- 配置文件路径 :
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 文件格式:纯文本列表。
- 配置方式:直接按行写入配置类的全限定名(不需要 Key,也不需要逗号分隔)。
示例代码:

文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
text
com.example.project.autoconfigure.MyFirstAutoConfiguration
com.example.project.autoconfigure.MySecondAutoConfiguration
3. 核心差异对比表
| 特性 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| 配置文件位置 | META-INF/spring.factories |
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |
| 加载机制 | SpringFactoriesLoader |
ImportCandidates (底层机制变化) |
| 文件内容格式 | Key=Value (类名逗号分隔) | 纯类名列表 (换行分隔) |
| 注解支持 | 通常使用 @Configuration |
推荐使用 @AutoConfiguration (3.x 专属改进) |
| 兼容性 | 支持旧版 | 不再支持 从 spring.factories 读取自动配置 |
4. 为什么要改?
- 性能提升 :旧的
spring.factories文件通常包含各种类型的配置(监听器、环境后处理器、自动配置等),文件解析需要读取所有内容。新的.imports文件专门用于自动配置,文件更小,解析更快。 - 更清晰的结构 :
META-INF/spring/目录为 Spring 相关的配置提供了一个专门的命名空间,避免了根目录META-INF下的混乱。 - 开发体验:新的格式不需要手动维护复杂的 Key 和逗号分隔符,直接一行一个类名,不仅易读,也方便版本控制解决冲突。
5. 迁移指南(如何适配)
如果你正在维护一个自定义的 Spring Boot Starter,并希望升级到 Spring Boot 3.x:
第一步:创建新文件
在 src/main/resources/META-INF/spring/ 目录下创建名为 org.springframework.boot.autoconfigure.AutoConfiguration.imports 的文件。
第二步:迁移配置类
将原 spring.factories 中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 后面的类名复制到新文件中,每行一个。
第三步:替换注解(推荐)
在配置类上,将 @Configuration 替换为 Spring Boot 2.7+ 引入的 @AutoConfiguration。
-
旧代码 (2.x):
java@Configuration @ConditionalOnClass(Service.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MyAutoConfiguration { ... } -
新代码 (3.x):
java@AutoConfiguration(after = DataSourceAutoConfiguration.class) @ConditionalOnClass(Service.class) public class MyAutoConfiguration { ... }注意:
@AutoConfiguration自带了after、before等属性,替代了@AutoConfigureAfter/@AutoConfigureBefore注解。 -
对于应用开发者 :如果你只是使用标准的 Starter(如
spring-boot-starter-web),升级时通常不需要关心这个变化,因为官方库已经适配了。 -
对于 Starter 开发者 :必须迁移配置文件位置,否则在 Spring Boot 3.x 项目中,你的自动配置类将不会生效。