Spring注解之-@ConditionalOnExpression表达式

@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'}")

 

我们需要“逻辑或”
  1. 首先一个类是不能标注多个相同annotation的,编译通不过。
@Order(1)
@Component
✖️@ConditionalOnProperty(name="app.initialize.dictionary", havingValue="true")
✖️@ConditionalOnProperty(name="app.initialize.all", havingValue="true")
public class DictionaryInitializer implements CommandLineRunner
  1. @ConditionalOnProperty 本身也并没有这样的功能
  2. 一种繁琐的做法,是自定义条件,继承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{}
  1. 还有一种比较灵活的方式是使用@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}}")

 
 
posted @ 2022-02-21 14:02  牧之丨  阅读(3798)  评论(0)    收藏  举报