Spring boot中的注解@ConditionalOnProperty,可以通过配置文件中的属性值来判定configuration是否被注入,

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty { /**
* String数组 该属性与下面的 name 属性不可同时使用,
* 当value所对应配置文件中的值为false时,注入不生效,不为fasle注入生效
* value有多个值时,只要有一个值对应为false,则注入不成功
*/
String[] value() default {}; /**
* 配置文件中key的前缀,可与value 或 name 组合使用
*/
String prefix() default ""; /**
* 与 value 作用一致
*/ String[] name() default {};
/**
* 与value 或 name 组合使用,只有当value 或 name 对应的值与havingValue的值相同时,注入生效 */ String havingValue() default ""; /** * 配置中缺少对应的属性时,是否可以被注入;为true时缺少对应配置可注入 */ boolean matchIfMissing() default false;}
*/
String havingValue() default ""; /**
*该属性为true时,配置文件中缺少对应的value或name的对应的属性值,也会注入成功
*/
boolean matchIfMissing() default false;

// 对应的测试注入情况
@Configuration
@ConditionalOnProperty(value = "parentName.sonName")
public class parentNameConfig {
}
.yml配置如下:
parentName:
    sonName: true     //正常
parentName:
    sonName:          //正常,空字符时    
parentName:
    sonName: false       //失败
parentName:
    sonName: null      //正常
parentName:
    sonName: 123      //正常
    
把第二行换成:
@ConditionalOnProperty(value = "parentName.sonName",havingValue = "123")    
.yml配置如下:
parentName:
    sonName: 123      //正常
parentName:
    sonName: 1234      //失败
parentName:
    sonName: false      //失败
    
把第二行换成:
@ConditionalOnProperty(value = "parentName.sonName",havingValue = "false")    
.yml配置如下:
parentName:
    sonName: false      //正常
    
把第二行换成:
@ConditionalOnProperty(prefix = "parentName",name = "sonName",havingValue = "123")
.yml配置如下:
parentName:
    sonName: 123      //正常    
parentName:
    sonName: 1234      //失败,与havingValue给定的值不一致
    
把第二行换成:
@ConditionalOnProperty(prefix = "parentName",name = "sonName",havingValue = "123",matchIfMissing = true)
.yml配置如下:    
不配置相关参数       //正常,当matchIfMissing = true时,即使没有该parentName.sonName属性也会加载正常
 
 
把第二行换成:
@ConditionalOnProperty(prefix = "parentName",name = "sonName",havingValue = "123",matchIfMissing = false) //这里matchIfMissing默认为false,写不写都行
.yml配置如下:    
不配置相关参数       //失败,当matchIfMissing = false时,必须要有对应的property
parentName:
    sonName: 123     //正常    
 
把第二行换成:
@ConditionalOnProperty(prefix = "parentName.", name = "sonName")//prefix带了.(点)
.yml配置如下:    
parentName:
    sonName: true    //正常
parentName:
    sonName: 123     //正常
    
把第二行换成:    
@ConditionalOnProperty(prefix = "parentName",value = {"sonName2"},name = {"sonName"})
.yml配置如下:    
parentName:
    sonName: true    //项目Debug启动失败,The name and value attributes of @ConditionalOnProperty are exclusive
                     //@ConditionalOnProperty的name和value属性是互斥的,不能同时出现
 
把第二行换成:    
@ConditionalOnProperty(prefix = "parentName",name = {"sonName"})    
.yml配置如下:    
parentName:
    sonName: true    //正常    
 
把第二行换成:
@ConditionalOnProperty(prefix = "parentName",name = {"sonName","flag"})  //name中的属性需要两个都存在且都不为false才会加载正常
.yml配置如下:    
parentName:
    sonName: true
    flag: true       //正常
parentName:
    sonName: true
    flag: 123        //正常
parentName:
    sonName: true
    flag: false      //失败    
parentName:
    sonName: false
    flag: false      //失败    
 
把第二行换成:
@ConditionalOnProperty(prefix = "parentName", name = {"sonName", "flag"}, havingValue = "false")
parentName:
    sonName: false
    flag: false      //正常    
 
把第二行换成:
@ConditionalOnProperty(prefix = "parentName", name = {"sonName", "flag"}, havingValue = "123")//parentName.sonName和parentName.flag的值都要与havingValue的一致才行
parentName:
    sonName: 123
    flag: 1234       //失败    
parentName:
    sonName: 123
    flag: 123         //正常
parentName:
    sonName: 123     //失败,缺少parentName.flag
    
把第二行换成:    
@ConditionalOnProperty(prefix = "parentName", name = {"sonName", "flag"}, havingValue = "123",matchIfMissing = true)//matchIfMissing = true允许缺少    
parentName:
    sonName: 123     //正常    
.yml配置如下:    
不配置相关参数      //正常    
 
把第二行换成:    
@ConditionalOnProperty(prefix = "parentName", name = {"sonName", "flag"}, havingValue = "123")
.yml配置如下:    
不配置相关参数      //失败

使用@ConditionalOnProperty注解的更多相关文章

  1. Springboot @ConditionalOnProperty注解

    最近看了一段代码其中用到了@ConditionalOnProperty注解,直接没有了解过这个注解,今天看到了顺便了解一下 具体代码如下 @Configuration public class Web ...

  2. @ConditionalOnProperty注解

    一 源码解析 查看ConditionalOnProperty的源码 package org.springframework.boot.autoconfigure.condition; import j ...

  3. springboot注解之@ConditionalOnProperty

    最近在研究springboot的源码,看到很多@ConditionalOnXxx的注解,大概明白此注解的意思,就是判断条件,这个条件就是Xxx,例如ConditionalOnProperty就是判断配 ...

  4. Spring Conditional注解使用小结

    今天我们来总结下Conditional注解的使用. Conditional注解 增加配置类Config package condition; import org.springframework.co ...

  5. @ConditionalOnProperty来控制Configuration是否生效

    1. 简介 Spring Boot通过@ConditionalOnProperty来控制Configuration是否生效 2. 说明 @Retention(RetentionPolicy.RUNTI ...

  6. Spring Boot中@ConditionalOnProperty使用详解

    在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能. Spring Boot中的使用 在Spring Boot的源 ...

  7. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  8. SpringBoot自动化配置之四:@Conditional注解详解

    前言 之前在分析spring boot 源码时导出可见@ConditionalOnBean 之类的注解,那么它到底是如何使用的以及其工作流程如何,我们这里就围绕以下几点来分析: @Conditiona ...

  9. 玩转SpringBoot用好条件相关注解,开启自...

    官方提供的常用条件注解 因为Spring的核心是基于bean的,所以这些条件注解主要是影响bean的注册. 因为注册的bean不同了,最后对外呈现的行为就不同了.不就是自动配置了. 一.最常用的应该是 ...

随机推荐

  1. prism App.config 配置

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...

  2. Linux从一个服务器拷贝文件到另一个服务器上

    ***复制文件夹到另外一个服务器scp -r tmp root@114.215.80.12:/work/temp输入密码 scp -r customer root@114.215.80.12:/hom ...

  3. mingw32环境上静态编译 dav1d 0.4.0

    2019-08-05 发布 dav1d 0.4.0 dav1d 'Cheetah', the fast and small AV1 decoder This is the fourth major r ...

  4. 采用WPF技术开发截图程序

    前言  QQ.微信截图功能已很强大了,似乎没必要在开发一个截图程序了.但是有时QQ热键就是被占用,不能快速的开启截屏:有时,天天挂着QQ,领导也不乐意.既然是程序员,就要自己开发截屏工具,功能随心所欲 ...

  5. DMA(Direct Memory Access直接存储器访问)总结

    转载于http://blog.csdn.net/peasant_lee/article/details/5594753 DMA一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,不需要CP ...

  6. 如何解决idea本身的乱码以及解决代码中出现的乱码?

    1:解决idea中控制台的乱码现象(3中方法): 第一种: 如图需要找到idea的安装路径: idea\IntelliJ IDEA 2018.3.2\bin 在这个路径下面有一个文件叫:idea64. ...

  7. 奥比中光Astra Pro在ROS系统中的使用

    奥比中光Astra Pro在ROS系统中的使用 上一次介绍了Astra Pro在ubuntu中的使用,由于Astra Pro使用uvc传输彩色图像,所以当用rqt_image_view窗口 时,看不到 ...

  8. 【Qt开发】QTableWidget设置根据内容调整列宽和行高

    QTableWidget要调整表格行宽主要涉及以下一个函数 1.resizeColumnsToContents();                      根据内容调整列宽            ...

  9. 【DSP开发】shared memory VS mailbox

    Hello, Hi everyone, I have a simple question. Could anyone explain to me the difference between Mail ...

  10. win10 hhctrl.ocx 丢失

    1.我的是从同事电脑上复制过来的,他电脑也是win102.复制文件“hhctrl.ocx”到系统目录下  32位系统目录为:C:\WINNT\System32:64位系统为C:\Windows\Sys ...