女生做蛋糕甜品屋宝宝
105.50M · 2026-04-17
每次看到这个小东西我都要楞一下,烦人,今天非得记录一把
下面这个条件注解:
@ConditionalOnProperty(
prefix = "demo.feature",
name = "enabled",
havingValue = ""
)
配置文件中写:
demo:
feature:
enabled: true
Bean 被加载了。
如果你以为 havingValue="" 表示“只匹配空字符串”,那这个结果一定不符合预期。
havingValue = "" 并不表示匹配空值。
真实含义是:
这不是 Bug,是 Spring Boot 的既定行为。
核心逻辑在 OnPropertyCondition:
private boolean isMatch(String value, String requiredValue) {
if (StringUtils.hasLength(requiredValue)) {
return requiredValue.equalsIgnoreCase(value);
}
return !"false".equalsIgnoreCase(value);
}
关键点只有一个:
havingValue="" → hasLength("") == false"false",就返回 true当 havingValue="" 时,等价判断如下:
| 配置值 | 是否生效 |
|---|---|
| true | |
| 1 / yes / on | |
| 空字符串 | |
| false |
注意:根本不存在“等于空字符串才生效”这回事。
Spring Boot 对开关型配置的默认态度一直很明确:
havingValue="" 只是触发了这套默认逻辑。
这也是为什么很多自动配置只写:
@ConditionalOnProperty(prefix = "xxx", name = "enabled")
havingValue = "true"
谁看都不会误解,行为稳定。
havingValue = ""
这行代码的真实含义,90% 的人第一眼都会理解错。
问题不在 Spring,而在于:
如果你不翻源码,就永远以为自己用对了。