Spring Boot自动装配通过@EnableAutoConfiguration触发条件化配置加载,核心是AutoConfigurationImportSelector读取AutoConfiguration.imports并按条件注入@Configuration类。

Spring Boot自动装配靠的是@SpringBootApplication里的@EnableAutoConfiguration
这个注解不是魔法,它本质是触发了Spring的条件化配置加载机制。真正干活的是AutoConfigurationImportSelector——它在启动时读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 2.7+)或旧版的META-INF/spring.factories,把一长串@Configuration类塞进Spring容器。
注意:不是所有标了@Configuration的类都会被加载,得过“条件关”。比如DataSourceAutoConfiguration会检查DataSource类是否在classpath、是否已存在DataSource bean、spring.datasource.url是否配置等。
- Spring Boot 2.7+ 强制使用
AutoConfiguration.imports,老项目升级后如果还依赖spring.factories,得手动迁移或加兼容配置 -
@ConditionalOnClass检查的是类能否被ClassLoader加载,不是“是否存在jar”,所以即使jar在路径里但被排除(如excludes),也可能不生效 - 自定义starter必须把自动配置类全限定名写进
AutoConfiguration.imports,一行一个,不能有空行或注释
自定义自动配置类要避开@Configuration和@Bean的常见陷阱
很多人写完@Configuration类就以为完事了,结果启动时报BeanDefinitionOverrideException或者bean没生效。核心问题在于:Spring Boot默认不允许同名bean覆盖(spring.main.allow-bean-definition-overriding=false),而你的配置类又没加条件约束。
org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'dataSource' for bean class [com.zaxxer.hikari.HikariDataSource] conflicts with existing, non-compatible bean definition of same name and class [javax.sql.DataSource]
这类错误通常是因为你手动声明了@Bean DataSource,又没加@ConditionalOnMissingBean,导致和DataSourceAutoConfiguration冲突。
立即学习“Java免费学习笔记(深入)”;
启山智软物流配送是基于Spring Cloud 和 Vue.js的JAVA物流配送系统。包含总控制后台 、城市合伙人(商家pc端)、 区域团长后台 、用户端小程序 、手机H5等多个操作模块。为响应用户需求我们新增了后台自定义装修组件模块,使页面更加美观,操作更加灵活简便。淘宝商品CSV一键导入,提升用户使用感。还有与众不同的管理台侧边栏设计,打破传统管理台样式。 另有公众号接龙、引导页上传、区域团
- 所有
@Bean方法务必配@ConditionalOnMissingBean(指定type或name),否则极易覆盖官方自动配置 - 避免在自动配置类里用
@ComponentScan,它会扫到不该扫的类,破坏条件逻辑 - 如果依赖其他自动配置(比如你的
MyServiceAutoConfiguration要用DataSource),用@AutoConfigureAfter(DataSourceAutoConfiguration.class)而不是@DependsOn
spring.autoconfigure.exclude禁用自动配置的实际效果很“硬”
这个配置项看起来只是“跳过某个配置类”,但实际影响比想象中深。它是在AutoConfigurationImportSelector解析阶段就从候选列表里移除该类,后续所有条件注解(@ConditionalOnClass、@ConditionalOnProperty)都不再执行。
举个典型场景:你想禁用H2ConsoleAutoConfiguration,但保留DataSourceAutoConfiguration。如果只写spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,没问题;但如果误写成spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,那整个JDBC生态(包括JdbcTemplate、事务管理器)都会消失,哪怕你手动配了DataSource也没用。
- 排除类名必须是完整类名,大小写敏感,拼错就无效
- 多个类用逗号分隔,不能换行或加空格:
spring.autoconfigure.exclude=A,B,C - 排除后,该配置类里定义的所有
@Bean、@Import、@ConfigurationProperties绑定全部失效,不会回退到手动配置
调试自动装配最有效的办法是开--debug或设logging.level.org.springframework.boot.autoconfigure=DEBUG
启动时加--debug参数,Spring Boot会在控制台输出两块关键信息:Positive matches(哪些自动配置被成功启用)和Exclusions(哪些被排除),以及详细的negative matches(为什么没启用,比如Did not find class或Unmatched conditions)。
比看日志更快的方式是断点进AutoConfigurationImportSelector.getAutoConfigurationEntry(),观察autoConfigurationClasses列表和exclusions内容——这才是真实发生的装配决策链。
-
negative matches里出现OnClassCondition失败,大概率是jar包没引入或版本不对(比如用了spring-boot-starter-webflux却想激活WebMvcAutoConfiguration) - 如果某配置类出现在
Positive matches但对应bean没注入,说明它内部的@Bean方法被条件拦截了,得继续查那个@Bean上的@Conditional - IDEA里可以右键运行配置 → 修改
Environment variables加DEBUG=true,不用改命令行
@ConditionalOnClass + @ConditionalOnMissingBean + @ConditionalOnProperty同时存在时,只要一个为false,整个@Bean就静默消失,连warn日志都不打。









