"小崔在排查自动配置问题时问:'白歌,为什么@DataSourceAutoConfiguration有时生效有时不生效?'白歌说:'因为它头顶有一排条件注解在把关。只有吃透这些条件注解,你才能真正驾驭自动配置。'这一章,我们将逐个拆解 Spring Boot 自动配置的'决策单元'——核心条件注解。"
章节导读:核心注解
本章定位
本章解决的核心问题:Spring Boot 如何通过 @Conditional 条件注解家族,实现"按需装配、用户优先、配置可控"的智能自动配置决策。
学习路线图
学习顺序说明:先理解 @SpringBootApplication 这个"三合一门面"的拆解与执行时序 → 深入 @EnableAutoConfiguration 这个自动配置引擎的点火开关 → 然后逐一吃透四大条件注解:@ConditionalOnClass(类路径探测器)、@ConditionalOnMissingBean(用户优先守卫)、@ConditionalOnProperty(配置开关)、@ConditionalOnBean(容器依赖链)。这些注解是自动配置"智能决策"的底层逻辑单元。
文件关系说明
| 文件 | 一句话角色 |
|---|---|
SpringBootApplication.md | 三合一组合注解:集 @Configuration、@EnableAutoConfiguration、@ComponentScan 于一体,是 Spring Boot 应用的入口印章。 |
EnableAutoConfiguration.md | 自动配置引擎的点火开关,通过 @Import 触发 AutoConfigurationImportSelector,从 spring.factories 加载候选配置类。 |
ConditionalOnClass.md | 类路径探测器:只有当指定类存在于类路径中时,才启用当前配置——是"按需加载"的第一道闸门。 |
ConditionalOnMissingBean.md | 用户配置优先守卫:只有当容器中不存在某 Bean 时,自动配置才创建默认实现——实现"用户自定义覆盖默认配置"。 |
ConditionalOnProperty.md | 配置属性开关:通过 application.yml 中的属性值控制功能启用/禁用,实现"配置驱动行为"。 |
ConditionalOnBean.md | 容器存在性条件:只有当容器中已存在某 Bean 时,当前配置才生效——在自动配置类之间建立依赖链。 |
知识图谱
核心逻辑:@SpringBootApplication 是门面,@EnableAutoConfiguration 是引擎,四个条件注解是引擎的"决策阀门"。只有当所有阀门同时放行,候选配置类才能最终被注册为 Bean。@ConditionalOnClass 回答"依赖有了吗",@ConditionalOnMissingBean 回答"用户已经自定义了吗",@ConditionalOnProperty 回答"配置开关打开了吗",@ConditionalOnBean 回答"前置依赖准备好了吗"。
与上下章的衔接
上一章回顾:你理解了自动配置从 @EnableAutoConfiguration 到 spring.factories 再到 Bean 注册的完整流水线。本章将深入流水线上的"阀门系统"——条件注解,它们是自动配置"为什么生效/为什么不生效"的终极答案。
下一章预告:本章学完后,你已经掌握自动配置的决策逻辑。下一章「外部化配置与属性绑定」将学习如何通过 application.yml 和 @ConfigurationProperties 将外部配置注入到应用中,实现"同一份代码,多套环境运行"——条件注解负责"是否加载",外部化配置负责"加载后用什么参数"。