@conditionalonproperty 是 spring boot 提供的条件注解,用于根据配置文件属性值动态控制 bean 或配置类的加载;支持 name、havingvalue、matchifmissing、prefix 等参数,可实现功能开关、环境隔离等灵活配置,无需自定义注解类即可满足绝大多数场景。

Spring 的 @ConditionalOnProperty 本身已是可高度自定义的条件注解,无需额外“自定义注解类”即可满足绝大多数场景。它的核心在于灵活配置属性名、匹配值、是否存在、是否启用等逻辑。
直接使用 @ConditionalOnProperty 的关键配置项
你只需在 @Configuration 类或 @Bean 方法上标注它,并设置参数即可生效:
-
name:指定要检查的配置项名称(必填),如
"feature.enabled" -
havingValue:要求该属性值必须等于指定字符串(默认是
"true"),比如havingValue = "prod" -
matchIfMissing:当配置项未定义时,是否默认匹配(
true表示“没配也算满足”) -
prefix:可选前缀,常用于统一管理一组属性,如
prefix = "app.feature",配合name = "cache"就等价于检查app.feature.cache
常见组合用法示例
以下都是 Spring Boot 原生支持的写法,无需任何扩展:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 仅检查属性是否存在且为 true:
@ConditionalOnProperty("myapp.service.enabled") - 检查属性值是否为指定字符串:
@ConditionalOnProperty(name = "myapp.env", havingValue = "dev") - 允许属性缺失时也加载(适合兜底场景):
@ConditionalOnProperty(name = "myapp.debug", matchIfMissing = true) - 带前缀批量控制:
@ConditionalOnProperty(prefix = "myapp.db", name = "type", havingValue = "postgresql")
需要真正“自定义注解”的情况?
只有当你希望把多个条件封装成一个语义更明确的注解(例如 @EnableRedisCache 内部自动组合 @ConditionalOnProperty + @ConditionalOnClass),才需定义新注解并用 @Conditional 引入自定义 Condition 类。但此时不是“自定义 @ConditionalOnProperty”,而是用它作为基础构建更高层抽象。
调试技巧:确认条件是否生效
启动时加 --debug 参数,Spring Boot 会输出自动配置报告,其中 Positive matches 和 Exclusions 部分会明确列出每个 @ConditionalOnProperty 是否命中,方便排查配置未生效的原因。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










