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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM