首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用@ConditionalOnProperty注解

使用@ConditionalOnProperty注解

作者头像
yaphetsfang
发布2020-07-30 14:44:05
2.8K1
发布2020-07-30 14:44:05
举报
文章被收录于专栏:yaphetsfangyaphetsfang

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配置如下:    
不配置相关参数      //失败   
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档