Spring boot中的注解@ConditionalOnProperty,可以通过配置文件中的属性值来判定configuration是否被注入.
配置类:
@Configuration
@ConditionalOnProperty(prefix = “x.y”, name = “test”, havingValue = “1”, matchIfMissing = true)
public class XConfiguration {…}
配置文件:
x.y.test=1
解释:
prefix为配置文件中的前缀.
name为配置的名字.
havingValue是与配置的值对比值,当两个值相同返回true,配置类生效.
matchIfMissing属性为true时,配置文件中缺少对应的value或name的对应的属性值,也会注入成功.
使用场景:
1、在日常使用中,定义一个mq的消费,在本地测试环境、预发环境、线上环境均对此定义,满足不同阶段的开发、测试、上线需要。通常接入一个新的mq消费,三个环境使用同一套mq配置,可以保障开发联调效率和上线后保证和预发环境一致。但在一个mq主题中,一个应用只能消费一次,就意味着三个环境同时运行,只能有一个环境生效,则可以使用 @ConditionalOnProperty 注解,通过配置控制。
2、过滤器等随部署环境变动的类,使用该注解方便调试。
@ConditionalOnProperty(
prefix = "zn.com.interceptor",
name = "enable",
havingValue = "true"
)
还可以用在链式配置中,比如Spring MVC的过滤器和拦截器。
3、通过@ConditionalOnProperty来控制Configuration是否生效
@Configuration
//在application.properties配置"mf.assert",对应的值为true
@ConditionalOnProperty(prefix="mf",name = "assert", havingValue = "true")
public class AssertConfig {
@Autowired
private HelloServiceProperties helloServiceProperties;
@Bean
public HelloService helloService(){
HelloService helloService = new HelloService();
helloService.setMsg(helloServiceProperties.getMsg());
return helloService;
}
}
=====================
需要自己实现match方法
可以通过属性配置值,通过配置实现,更灵活方便,不用写代码
附1:类似的有很多
@Conditional(ZiDingYiCondition.class)
@ConditionalOnProperty
@ConditionalOnBean
@ConditionalOnClass
@ConditionalOnResource
@ConditionalOnExpression
@ConditionalOnMissingBean
其中: