在網上查詢@ConditionalOnProperty的使用的時候,發現好多類似的文章,但是例子都不夠全面。這裡記錄下測試示例,友善自己記憶。
1、簡介
SpringBoot通過@ConditionalOnProperty來控制@Configuration是否生效
2、說明
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
String[] value() default {}; //數組,擷取對應property名稱的值,與name不可同時使用
String prefix() default "";//property名稱的字首(最後一個屬性前的一串。比如aaa.bbb.ccc,則prefix為aaa.bbb),可有可無
String[] name() default {};//數組,property完整名稱或部分名稱(可與prefix組合使用,組成完整的property名稱),與value不可同時使用
String havingValue() default "";//可與name組合使用,比較擷取到的屬性值與havingValue給定的值是否相同,相同才加載配置
boolean matchIfMissing() default false;//預設配置。配置檔案沒有配置時,表示使用目前property。配置檔案與havingValue比對時,也使用目前property
boolean relaxedNames() default true;//是否可以松散比對,至今不知道怎麼使用的
}
3、單個示例
a、建立一個Configuration配置類:
@Data
@Configuration
@ConditionalOnProperty(value = "test.conditional", havingValue = "abc")
public class TestConfiguration {
/** 預設值 */
private String field = "default";
}
b、建立一個測試類:
@RestController
@RequestMapping("test")
public class TestController {
@Autowired(required = false)
private TestConfiguration test1Configuration;
@GetMapping("testConfiguration")
public String testConfiguration() {
if (test1Configuration != null) {
return test1Configuration.getField();
}
return "OK";
}
}
c、配置檔案application.yml:
test:
conditional: abc
d、通過postman或者其它工具發送請求。結果如下:
default
以上表明TestConfiguration配置檔案生效了
4、多種示例
接下來,改變@ConditionalOnProperty中的各個屬性,然後通過檢視傳回結果來判斷TestConfiguration是否生效。
1、不配置@ConditionalOnProperty,直接生效。
2、隻有value屬性,沒有havingValue屬性。如果application.yml配置了test.conditional則生效,否則不生效。
@ConditionalOnProperty(value = "test.conditional")
test:
conditional: edf
3、prefix + name相當于value屬性(兩者不可同時使用)。如果application.yml配置了test.conditional則生效,否則不生效
@ConditionalOnProperty(prefix = "test", name = "conditional")
test:
conditional: edf
4、name屬性為一個數組,當要比對多個值時,如果application.yml的配置與name屬性中的值一一比對則生效,否則不生效
@ConditionalOnProperty(prefix = "test", name = { "conditional", "other" })
test:
conditional: abc
other: edf
5、當matchIfMissing=true時:
a、如果application.yml配置了test.conditional則生效(此時matchIfMissing可有可無),否則不生效
b、如果application.yml啥都沒配置則生效
@ConditionalOnProperty(prefix = "test", name = "conditional", matchIfMissing = true)
6、加上havingValue屬性。當havingValue的值與application.yml檔案中test.conditional的值一緻時則生效,否則不生效
@ConditionalOnProperty(prefix = "test", name = "conditional", havingValue = "abc")
test:
conditional: abc
7、加上havingValue屬性。name屬性為數組時,如果application.yml檔案中配置了相關屬性且值都一緻時則生效,否則不生效
@ConditionalOnProperty(prefix = "test", name = { "conditional", "other" }, havingValue = "abc")
test:
conditional: abc
other: abc