@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
String[] value() default {}; //數組,獲取對應property名稱的值,與name不可同時使用
String prefix() default "";//property名稱的前綴,可有可無
String[] name() default {};//數組,property完整名稱或部分名稱(可與prefix組合使用,組成完整的property名稱),與value不可同時使用
String havingValue() default "";//可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才加載配置
boolean matchIfMissing() default false;//缺少該property時是否可以加載。如果爲true,沒有該property也會正常加載;反之報錯
boolean relaxedNames() default true;//是否可以鬆散匹配,至今不知道怎麼使用的
}
@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配置如下:
不配置相關參數 //失敗
歡迎關注我的公衆號