Spring Boot 5.0(即3.x最新稳定版)中自定义Starter必须将自动配置类声明在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,每行一个全限定类名,且配置类需使用@AutoConfiguration替代@Configuration,并搭配@ConditionalOnClass、@ConditionalOnMissingBean等条件注解,否则启动失败或静默跳过。

要让自定义Starter在Spring Boot 5.0(实际为Spring Boot 3.x演进路线中的最新稳定版,当前主流为3.2+)中正确触发自动配置,必须精准匹配元数据注册方式、条件注解语义与类路径可见性三重约束。手动写错一行imports路径或忽略@AutoConfiguration的包扫描边界,就会导致Bean完全不注册,且无任何报错提示。
确认自动配置类注册方式
Spring Boot 5.0沿用Spring Boot 3.x规范,【彻底废弃META-INF/spring.factories】,所有自动配置类必须声明在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,每行一个全限定类名。
打开你的autoconfigure模块的src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,确保内容为纯文本格式,无BOM头、无空行、无注释:
com.example.starter.GreeterAutoConfiguration
com.example.starter.RedisAutoConfiguration
注意:如果该文件不存在,或路径拼写错误(比如写成spring.autoconfiguration.imports),Spring Boot将完全跳过该JAR的自动配置扫描,且不会报错——这是最隐蔽的失败原因。
编写符合5.0语义的自动配置类
使用@AutoConfiguration替代@Configuration,并显式指定生效顺序和依赖关系:
① 在类上标注@AutoConfiguration,而非@Configuration;
② 添加@AutoConfigureBefore(WebMvcAutoConfiguration.class)或@AutoConfigureAfter(DataSourceAutoConfiguration.class)控制加载时机;
③ 所有@Bean方法必须搭配@ConditionalOnMissingBean或@ConditionalOnClass等条件注解,否则会被视为无条件强制注册——这在5.0中会直接触发启动失败(因违反严格条件校验策略)。
方法一:基础自动配置模板
@AutoConfiguration
@ConditionalOnClass(Greeter.class)
public class GreeterAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public Greeter greeter() {
return new Greeter();
}
}
方法二:带属性绑定的配置
@AutoConfiguration
@ConditionalOnProperty(prefix = "my.greeter", name = "enabled", havingValue = "true", matchIfMissing = true)
public class GreeterAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public Greeter greeter(MyStarterProperties properties) {
return new Greeter(properties.getHost(), properties.getPort());
}
}
验证条件注解是否真正满足
Spring Boot 5.0对条件评估更严格,以下情况会导致配置类被静默过滤:
• @ConditionalOnClass要求目标类必须在当前ClassLoader的bootstrap或application层级存在,若依赖通过provided scope引入且未被打包进fat jar,条件不成立;
• @ConditionalOnProperty默认只读取application.properties,若配置写在bootstrap.yml中且未引入spring-cloud-starter-bootstrap,该条件永远为false;
• @ConditionalOnMissingBean会检查所有已注册Bean(含父上下文),若测试时提前手动注册了同类型Bean,自动配置将跳过。
调试技巧:启动时添加JVM参数-Ddebug=true,控制台会输出所有被排除的自动配置类及具体原因,例如:GreeterAutoConfiguration did not match: - @ConditionalOnClass did not find required class 'com.example.Greeter'。
打包与依赖范围设置
Starter模块必须是pom类型,且仅声明compile范围的autoconfigure模块依赖:
【autoconfigure模块自身不能声明spring-boot-starter-web等starter依赖】,否则会污染使用者项目依赖树,引发版本冲突或重复自动配置。
autoconfigure模块的pom.xml中,Spring Boot相关依赖应设为provided:

















