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