@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

 

posted @ 2020-03-31 13:05  仅此而已-远方  阅读(5250)  评论(1编辑  收藏  举报