使用@ConditionalOnProperty注解


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配置如下:    
不配置相關參數      //失敗   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM