必须用@AutoConfiguration开发Starter时实现零配置即用,需在META-INF/spring/...中声明并配合条件注解;自己项目中写配置类、需@ComponentScan扫描或覆盖默认配置时,必须用@Configuration。

Spring Boot项目里该用@Configuration还是@AutoConfiguration,直接决定Bean是否被自动扫描、是否参与条件判断、会不会和用户配置冲突——选错会导致Bean重复注册、条件失效或启动失败。
先看本质区别
普通@Configuration类是Spring原生机制,会被@ComponentScan扫到,走标准的Bean定义流程;而@AutoConfiguration是Spring Boot 2.7+专为自动配置设计的注解,它不参与组件扫描,只在@EnableAutoConfiguration触发时,由AutoConfigurationImportSelector按需加载,且默认隔离在自己的命名空间里。
你写的业务配置类,比如数据库连接池参数、自定义Service实现,必须用@Configuration;但如果你正在开发一个Starter,想让下游项目引入后自动装配RedisTemplate、自动绑定redis.host配置,那就必须用@AutoConfiguration。
什么时候必须用@AutoConfiguration
方法一:你要发布一个第三方Starter,且希望下游项目“零配置即用”
第一步:在Starter模块的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,写入你的自动配置类全限定名,例如:com.example.redis.RedisAutoConfiguration
第二步:在该类上标注@AutoConfiguration,而不是@Configuration;否则Spring Boot启动时根本不会识别它——【@Configuration类不会被AutoConfigurationImportSelector加载】
第三步:配合@ConditionalOnClass(RedisTemplate.class)等条件注解,确保只在类路径存在Redis相关jar时才生效;@AutoConfiguration的条件评估时机比@Configuration早得多,能准确感知依赖是否存在。
这一步操作起来很简单,直接把文件拖进去就行。
什么时候坚决不能用@AutoConfiguration
方法一:你在自己项目的src/main/java下写配置类
直接写@AutoConfiguration会失效——因为Spring Boot只从Starter的META-INF/spring/...路径加载自动配置类,你本地代码里的类不会被AutoConfigurationImportSelector读取。
方法二:你需要通过@ComponentScan自动发现配置类
@AutoConfiguration类默认不被@ComponentScan扫描,即使加了@Component也不行;它必须显式注册进imports文件才能生效。如果你依赖包扫描来加载配置,必须用@Configuration。
方法三:你要覆盖Spring Boot默认配置
比如想用自己的DruidDataSource替代HikariCP,必须用@Configuration + @Bean + @Primary,再配合@ConditionalOnMissingBean;@AutoConfiguration不允许在用户工程里直接定义,否则会破坏自动配置的加载顺序和条件隔离。
怎么选:一张决策表
你正在开发的是Starter模块,且目标是让下游项目无感集成 → 用@AutoConfiguration。
你正在写自己项目的配置类,哪怕只是配一个RestTemplate Bean → 用@Configuration。
你想让某个配置类只在测试环境生效 → 用@Configuration + @Profile("test");@AutoConfiguration不支持Profile控制,它的条件体系是独立的。
你发现启动时报BeanDefinitionOverrideException,提示RedisTemplate已存在 → 检查是否误把@Configuration类放在了Starter里,又同时用了@AutoConfiguration导入同一类——这是典型冲突场景,删掉其中一个。

















