@conditionalonproperty前缀匹配按点号层级路径严格匹配,非字符串截取;如prefix="app.feature"只匹配app.feature.enabled等带后续点号的键,不匹配app.feature或app.featurex。

在Spring Boot中使用@ConditionalOnProperty注解时,前缀匹配错误会导致条件判断失效,配置项明明存在却始终不生效。
理解前缀匹配的本质
前缀不是字符串截取,而是按点号(.)分隔的层级路径匹配。例如prefix = "app.feature"只会匹配app.feature.enabled、app.feature.timeout这类以app.feature.开头且后跟点号的完整键名,【不会匹配app.feature或app.featureX】。
若配置写成app.feature=true,该键没有后续点号和子属性,@ConditionalOnProperty(prefix = "app.feature", name = "enabled")根本不会扫描它。
正确声明前缀与属性名的组合方式
方法一:用prefix + name拼出完整key
@ConditionalOnProperty(prefix = "app.cache", name = "redis.enabled") → 实际检查app.cache.redis.enabled
方法二:只用name,不设prefix
@ConditionalOnProperty(name = "app.cache.redis.enabled") → 直接检查该完整键是否存在
方法三:prefix单独存在,name为空数组
@ConditionalOnProperty(prefix = "app.db") → 检查是否存在任意以app.db.开头的属性,如app.db.url、app.db.pool.size
验证前缀是否生效的实操步骤
第一步:在application.yml中添加测试配置
app.cache.redis.enabled: true
第二步:编写带条件的Bean
@Bean
@ConditionalOnProperty(prefix = "app.cache", name = "redis.enabled")
public RedisTemplate redisTemplate() { return new RedisTemplate(); }
第三步:启动应用后查看日志中的Condition Evaluation Report,搜索“ConditionalOnProperty”,确认匹配的key是否为app.cache.redis.enabled
第四步:故意把yml写成app.cache.redis_enable: true → 此时Bean不会创建,因为name值必须严格对应点号分隔的属性名片段,下划线不等于点号











