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)

  

 

posted @   变体精灵  阅读(2958)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示