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