在网上查询@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