@ConditionalOnExpression("'true")
当括号中的内容为true时,使用该注解的类被实例化,支持语法如下:
@ConditionalOnExpression("${mq.cumsumer.enabled}==1&&${rabbitmq.comsumer.enabled:true}")
@ConditionalOnExpression("'${mq.comsumer}'.equals('rabbitmq')")
@ConditionalOnExpression("'${application.customize}'.equals('EDGE')||${app.chain.enabled:'false'}")
我们需要“逻辑或”
- 首先一个类是不能标注多个相同annotation的,编译通不过。
@Order(1) @Component ✖️@ConditionalOnProperty(name="app.initialize.dictionary", havingValue="true") ✖️@ConditionalOnProperty(name="app.initialize.all", havingValue="true") public class DictionaryInitializer implements CommandLineRunner
- @ConditionalOnProperty 本身也并没有这样的功能
- 一种繁琐的做法,是自定义条件,继承AnyNestedCondition
class DicOrAllCondition extends AnyNestedCondition { public DicOrAllCondition() { super(ConfigurationPhase.PARSE_CONFIGURATION); } @ConditionalOnProperty(name = "app.initialize.dictionary", value = "true") static class DicCondition { } @ConditionalOnProperty(name = "app.initialize.all", value = "true") static class AllCondition { } }
@Order(1) @Component @Conditional(DicOrAllCondition.class) public class DictionaryInitializer implements CommandLineRunner{}
- 还有一种比较灵活的方式是使用@ConditionalOnExpression写一个表达式
@Order(1) @Component @ConditionalOnExpression("${app.initialize.dictionary:false} || ${app.initialize.all:false}") public class DictionaryInitializer implements CommandLineRunner{}
精益无止境,其实还有更灵活的配置方式:除了dictionary其他都导入:
app.initialize.all=true
app.initialize.dictionary=false
换种说法就是:如果局部有配置,则按局部配置处理。如果局部没配置,则按全局配置处理。如果全局、局部都没配置,则默认不导入。这里可以利用“默认值”嵌套表达式实现。
@ConditionalOnExpression("${app.initialize.dictionary:${app.initialize.all:false}}")