在Spring Boot中,@ConditionalOnProperty需正确组合参数才能按配置项存在且值匹配加载Bean;必须指定name和havingValue(字符串需加引号),支持prefix+name或value数组写法,matchIfMissing=true可使缺省时加载,多属性联合判断需用name数组。

要在Spring Boot中让某个配置类或Bean只在特定配置项存在且值匹配时才加载,必须正确设置@ConditionalOnProperty注解的参数组合,否则即使配置文件写了属性,类也不会被扫描进容器。
基础写法:单属性名+值匹配
第一步:在application.properties中定义属性
feature.email.enabled=true
第二步:在配置类上添加注解
@ConditionalOnProperty(name = "feature.email.enabled", havingValue = "true")
这一步必须写全name和havingValue,【havingValue是字符串类型,必须带引号,写成true会编译报错】。如果只写@ConditionalOnProperty("feature.email.enabled"),则只要该属性存在且不为false(如"1"、"on"、"yes")就满足条件,不严格等于true。
带前缀的写法:避免属性名冗长
方法一:用prefix + name组合
配置文件写:app.notification.sms.timeout=30
注解写:@ConditionalOnProperty(prefix = "app.notification.sms", name = "timeout", havingValue = "30")
方法二:用value数组一次性声明完整键名
@ConditionalOnProperty(value = {"app.notification.sms.timeout"}, havingValue = "30")
注意:prefix和value不能同时使用,否则prefix会被忽略。选一种风格保持项目统一即可。
处理配置缺失的场景
@ConditionalOnProperty默认行为是:配置项不存在 → 条件不成立 → Bean不加载。
若希望缺省时也加载(比如开关默认开启),必须显式设置matchIfMissing = true:
@ConditionalOnProperty(name = "feature.ai.analysis", matchIfMissing = true)
【matchIfMissing默认为false,漏写会导致配置未定义时功能彻底失效,且无任何日志提示】
这个参数只控制“属性不存在”时的行为,不影响havingValue匹配逻辑。
多属性联合判断
当需要多个配置同时满足才启用组件时,用name数组:
@ConditionalOnProperty(name = {"feature.report.enabled", "feature.report.format.json"})
Spring会逐个检查这两个属性是否都存在且非false。任意一个缺失或值为false,整个条件即失败。
如果还要限定具体值,必须为每个属性单独指定havingValue——但@ConditionalOnProperty不支持为数组中的每个元素设不同havingValue,此时应拆分为多个独立注解或改用自定义Condition。

















