天天看點

@ConditionalOnProperty控制@Configuration是否生效

在網上查詢@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