Spring Boot 自动配置按需加载,仅当满足全部@Conditional条件(如类存在、Bean缺失、属性启用)时才注册Bean;候选类源自spring.factories中EnableAutoConfiguration键值,加载后经条件门禁筛选。

Spring Boot 项目启动时,自动配置类不是一股脑全加载进来,而是只加载当前项目真正需要的那些——比如你没引入 MySQL 驱动,【DataSourceAutoConfiguration 就根本不会生效】,连日志都不会打;你写了自己的 DataSource Bean,框架就自动跳过默认配置。
自动配置类从哪来
第一步:Spring Boot 启动时扫描所有 jar 包里的 META-INF/spring.factories 文件。
第二步:读取其中键为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 的值列表,这些就是候选自动配置类的全限定名。
第三步:把这些类全部反射加载进内存,但【此时只是加载,尚未注册 Bean】——它们还卡在“待审”状态,必须通过条件门禁才能放行。
条件门禁怎么拦人
方法一:@ConditionalOnClass(DataSource.class)
要求类路径里真实存在 javax.sql.DataSource 这个类。如果你没加 mysql-connector-java 或 hikari-cp,这个条件直接失败,整个配置类被丢弃。
方法二:@ConditionalOnMissingBean(DataSource.class)
检查 Spring 容器里是否已经有一个 DataSource 类型的 Bean。如果你自己写了 @Bean DataSource dataSource(),那这个自动配置就不会再创建第二个,避免冲突。
方法三:@ConditionalOnProperty(name = "spring.datasource.enabled", havingValue = "true")
读取配置文件,只有明确写了 spring.datasource.enabled=true 才放行。默认不写,这个属性视为不存在,条件不满足。
多个条件怎么组合生效
一个自动配置类上通常叠了三四个 @Conditional 注解,它们是“与”关系——全部为 true 才算通关。
比如 DataSourceAutoConfiguration 同时写了:
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(type = "javax.sql.DataSource")
@EnableConfigurationProperties(DataSourceProperties.class)
三者缺一不可。少任何一个,这个类就安静地退出,不注册任何 Bean,也不报错。
注意:@ConditionalOnMissingBean 如果只写 @ConditionalOnMissingBean 不指定 type 或 value,它会按返回类型推断——但容易误判,【务必显式写明 type 或 value】。

















