要让自定义Starter在Spring Boot 2.7和3.2上正确触发自动装配,必须分别适配spring.factories(2.7)和AutoConfiguration.imports(3.2)两套元数据机制,并统一使用@AutoConfiguration、显式声明条件注解参数、升级JDK至17+及迁移jakarta命名空间。

要让自定义 Starter 在 Spring Boot 2.7 和 3.2 上都能正确触发自动装配,必须分别适配两套元数据机制——旧版 spring.factories 已被移除语义,新版 AutoConfiguration.imports 成为唯一合法入口,且条件注解行为存在隐式差异。
自动装配元数据文件位置与格式差异
Spring Boot 2.7 起引入双轨兼容期,3.2.x 完全废弃 spring.factories 的自动配置加载能力。
方法一:Spring Boot 2.7.x 项目必须保留 META-INF/spring.factories
在 src/main/resources/META-INF/spring.factories 中写入:
【org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyAutoConfiguration】
注意:等号后不能有空格,类名必须是全限定名,末尾不能换行或加空行,否则 2.7.x 启动时会静默跳过该条目。
方法二:Spring Boot 3.2.x 项目只认 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
新建文件 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,内容为纯文本,每行一个自动配置类:
com.example.MyAutoConfiguration
这一步操作起来很简单,直接把文件拖进去就行。但必须确保文件路径完全正确——spring/ 目录下不能多一层 spring-boot/ 或拼错文件名,否则 3.2.x 根本不会扫描该文件。
自动配置类声明方式变化
2.7.x 兼容 @Configuration + @ConditionalOnXxx,但 3.2.x 强制要求使用 @AutoConfiguration 替代。
第一步:将原 @Configuration 改为 @AutoConfiguration
第二步:添加 @ImportRuntimeHints(MyRuntimeHints.class)(仅 3.2.x 需要)
第三步:若配置类依赖其他自动配置(如需 DataSource),用 @AutoConfigureAfter(DataSourceAutoConfiguration.class) 显式声明顺序;2.7.x 可用 @AutoConfigureBefore/After,但 3.2.x 中该注解语义更严格——它不再仅控制导入顺序,还参与 AOT 编译时的 Bean 图分析。
不这样做会导致 3.2.x 下启动报 BeanCurrentlyInCreationException,尤其在启用 GraalVM 原生镜像时必然失败。
条件注解行为差异与修复
同一个 @ConditionalOnProperty(name = "my.feature.enabled", havingValue = "true"),在 2.7.x 和 3.2.x 中解析逻辑不同。
方法一:统一用字符串字面量避免类型推断歧义
写成 @ConditionalOnProperty(prefix = "my", name = "feature.enabled", havingValue = "true"),而不是 @ConditionalOnProperty("my.feature.enabled") —— 后者在 3.2.x 中可能因配置元数据注册时机差异导致判断失效。
方法二:对 @ConditionalOnMissingBean 必须显式指定 type 或 name
【否则 3.2.x 会忽略该条件,直接注册 bean,覆盖用户自定义实例】
例如:@Bean @ConditionalOnMissingBean(type = "com.example.MyService"),不能只写 @ConditionalOnMissingBean。
切换步骤:从 2.7.x 升级到 3.2.x
① 将 JDK 升级至 17+(3.2.x 最低要求 JDK 17,JDK 8 项目无法运行)
② 修改 pom.xml 中 spring-boot-starter-parent 版本为 3.2.8(当前最新维护版)
③ 删除项目中所有 javax.* 包引用,替换为 jakarta.*(如 javax.servlet.http.HttpServletRequest → jakarta.servlet.http.HttpServletRequest)
④ 检查并重写所有自定义 @ConfigurationProperties 类:3.2.x 默认禁用宽松绑定(relaxed binding),必须显式加 @ConstructorBinding 或改用 record 构造注入
⑤ 运行 mvn clean compile,修复所有编译错误后执行 mvn spring-boot:run


















