Spring Boot 条件装配机制核心是通过 Condition 接口及 @ConditionalOnProperty 等预定义注解,基于运行时环境、配置、类路径等动态决定 Bean 是否加载;支持自定义 Condition 实现复杂判断逻辑,并可通过 --debug 查看条件评估结果。

Spring Boot 的条件装配机制,核心是通过 Condition 接口和一系列预定义的 @Conditional* 注解(如 @ConditionalOnProperty)控制 Bean 是否被加载。它不是“开关式”的硬编码控制,而是基于运行时环境、配置、类路径等状态动态决定装配逻辑。
自定义 Condition 实现灵活判断逻辑
当你需要根据复杂规则(比如某个服务是否可用、系统时间是否满足阈值、第三方 SDK 是否初始化成功)来决定是否注册 Bean 时,可实现 Condition 接口:
- 重写
matches(ConditionContext context, AnnotatedTypeMetadata metadata)方法,在其中获取Environment、BeanFactory、ClassLoader等上下文信息 - 返回
true表示满足条件,该 Bean 将被注册;返回false则跳过 - 配合
@Conditional(YourCustomCondition.class)使用在@Configuration类或@Bean方法上
例如:判断当前是否为灰度环境,可读取 context.getEnvironment().getProperty("app.env"),再比对值是否为 "gray"。
@ConditionalOnProperty 控制基于配置项的装配
这是最常用、最轻量的条件注解,适合根据 application.properties 或 application.yml 中的配置开关 Bean:
立即学习“Java免费学习笔记(深入)”;
-
@ConditionalOnProperty(name = "feature.sms.enabled", havingValue = "true"):要求配置项存在且值等于"true" -
@ConditionalOnProperty(prefix = "cache", name = "type", havingValue = "redis"):匹配cache.type=redis -
@ConditionalOnProperty(name = "debug.mode", matchIfMissing = true):若配置项未定义,默认视为满足条件
注意:havingValue 默认是字符串比较,不自动转换类型;若配置值是布尔型但写成 true(无引号),YAML 中会被解析为 boolean,此时需确保类型一致或改用 matchIfMissing + 逻辑判断。
组合多个条件:用 @ConditionalOnAllBeans 或嵌套 @Conditional
单一条件有时不够,比如“只有当 RedisTemplate 存在且配置开启了缓存”才装配缓存相关组件:
- 使用
@ConditionalOnBean(RedisTemplate.class)和@ConditionalOnProperty("cache.enabled")同时标注在同一个@Bean方法上,二者必须同时成立 - 若逻辑更复杂(如“启用 A 或启用 B”),可封装一个自定义
Condition,内部调用context.getBeanFactory().containsBean("xxx")和environment.getProperty(...)组合判断
调试条件装配是否生效
条件装配失败常因配置未生效、属性名拼写错误或 Profile 不匹配导致。可通过以下方式排查:
- 启动时加参数
--debug,Spring Boot 会输出自动配置报告,列出每个@Conditional的评估结果(Exclusions和Conditions Evaluations) - 检查
spring.profiles.active是否正确激活了对应环境,因为@ConditionalOnProperty默认不区分 profile,但配置本身可能被 profile 隔离 - 确认配置文件加载顺序:
application.yml、application-{profile}.yml、命令行参数,后加载的会覆盖前面的


















