Springboot 注解之 @ConditionalOnProperty
@ConditionalOnProperty 注解源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Retention (RetentionPolicy.RUNTIME) @Target ({ ElementType.TYPE, ElementType.METHOD }) @Documented @Conditional (OnPropertyCondition. class ) public @interface ConditionalOnProperty { String[] value() default {}; String prefix() default "" ; String[] name() default {}; String havingValue() default "" ; boolean matchIfMissing() default false ; boolean relaxedNames() default true ; } |
@ConditionalOnProperty 注解中这些属性是什么意思,作用是什么,我们分下面几种情况演示
1、如果不给 @ConditionalOnProperty 注解赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Configuration @ConditionalOnProperty public class SpringbootConfig { @Bean ( "mango" ) public Mango mango(){ return new Mango( "mango" , "黄色" , 6.00 ); } @Bean ( "watermelon" ) public Watermelon watermelon(){ return new Watermelon( "Watermelon" , "原谅色" , 3.0 ); } } |
启动的时候就会报错,根据提示可以得出,必须要配置出 name 或 value 属性
2、只配置 value 属性(如果只有一个 value 属性,那么 value 可以省略不写)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Configuration @ConditionalOnProperty (value= "favourite-tag" ) public class SpringbootConfig { @Bean ( "mango" ) public Mango mango(){ return new Mango( "mango" , "黄色" , 6.00 ); } @Bean ( "watermelon" ) public Watermelon watermelon(){ return new Watermelon( "Watermelon" , "原谅色" , 3.0 ); } } |
如果你在 springboot 的配置文件 application.properties 中配置了 favourite-tag 这个节点,那么 @ConditionalOnProperty 这个注解的判断条件成立,这个类上面标注的@Configuration 注解才会生效
下面这三种情况都成立
1 2 3 4 5 6 | // 经测试条件成立 favourite-tag // 经测试条件成立 favourite-tag= // 经测试条件成立 favourite-tag=fruit |
3、prefix、name、havingValue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Configuration @ConditionalOnProperty (prefix = "xiaomaomao.favourite" ,name= "fruit" ,havingValue = "watermelon" ) public class SpringbootConfig { @Bean ( "mango" ) public Mango mango(){ return new Mango( "mango" , "黄色" , 6.00 ); } @Bean ( "watermelon" ) public Watermelon watermelon(){ return new Watermelon( "Watermelon" , "原谅色" , 3.0 ); } } |
前缀为 xiaomaomao.favourite , 属性名称为 fruit ,那么拼接起来就是 xiaomaomao.favourite.fruit ,千万要注意 prefix 不能单独使用,它必须搭配 name 才代表一个完整的 value.
havingValue 的意思是必须要有的值为 watermelon
这里的意思是 application.properties 中必须要配置 xiaomaomao.favourite.fruit 标签,并且该标签的值必须为 watermelon ,否则判断条件不成立
1 | xiaomaomao.favourite.fruit=watermelon |
四、matchIfMissing
如果 matchIfMissing=true ,那么就不管 application.properties 配置文件中有没有配置 server.error.whitelabel.enabled 标签,判断条件都成立
1 | @ConditionalOnProperty (prefix = "server.error.whitelabel" , name = "enabled" , matchIfMissing = true ) |
例如,下面这个判断条件
如果没有配置 xiaomaomao.favourite.fruit 标签,由于 matchIfMissing = true ,所以判断条件也是成立的
但是如果配置了 xiaomaomao.favourite.fruit 标签,那么标签的值就必须为 watermelon
1 | @ConditionalOnProperty (prefix= "xiaomaomao.favourite" ,name = "fruit" ,havingValue = "watermelon" ,matchIfMissing = true ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?