如何使用@ConditionalOnExpression決定是否生效註釋
@ConditionalOnExpression決定是否生效註釋
因為用瞭好幾套消息隊列,我想在配置文件中配置如何開關切換消息隊列。
生產者還好,我隻要決定讀取配置文件決定用哪個生產者發送消息就行,但是rabbitmq的消費者是用註解啟動的,所以這個時候就用到瞭@ConditionalOnExpression
#消費者總開關,0關1開 mq.cumsumer.enabled=1 #rocketmq消費者開關,true開啟,false關閉 rocketmq.comsumer.enabled=false #rabbitmq消費者開關,true開啟,false關閉 rabbitmq.comsumer.enabled=true
@Component @RabbitListener(queues = "monitorDataQueue") @ConditionalOnExpression("${mq.cumsumer.enabled:0}==1&&${rabbitmq.comsumer.enabled:false}")
佈爾值和數字都還好說,但是字符串相等我搞瞭半天都不行,最後終於找到瞭資料
https://stackoverflow.com/questions/26451321/spring-boot-conditionalonproperty-or-conditionalonexpression
#選擇消費者,rocketmq,rabbitmq mq.comsumer=rabbitmq
@Component @RabbitListener(queues = "monitorDataQueue") @ConditionalOnExpression("'${mq.comsumer}'.equals('rabbitmq')")
一般來說這三種用法已經很靈活瞭,應該夠用瞭
註意
${rabbitmq.consumer.enabled:false}
代表的是當
rabbitmq.consumer.enabled
不存在時默認為後面的值,所以如果是boolean值的話直接使用
${rabbitmq.comsumer.enabled}
就行啦~
@ConditionalOnExpression 控制是否初始bean
我們有時候會遇到一些bean希望通過註冊中心控制是否被初始化,@ConditionalOnExpression可以幫我們辦到。這裡寫過小例子。
1、這個配置是我們上傳文件指定臨時目錄的配置
這裡通過這個查看是否註入成功。在我們想要註入控制註解添加 @ConditionalOnExpression(“${is.inject:true}”),通過配置文件來控制是否註入。
@Configuration public class PropertyConfig { @Bean @ConditionalOnExpression("${is.inject:true}") public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("C:\\Users\\Administrator\\Desktop\\deploy"); return factory.createMultipartConfig(); } }
2、在啟動類添加如下代碼進行測試
@SpringBootApplication public class DynamicElasticjobApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DynamicElasticjobApplication.class, args); } @Autowired private ApplicationContext applicationContext; @Override public void run(String... args) { MultipartConfigElement bean = applicationContext.getBean(MultipartConfigElement.class); System.out.println("::::::::::::::"+bean.getLocation()); } }
3、啟動為Application類,說明@Bean將其註入
4、當在配置文件application.properties中寫 is.inject=false時
此時結果為,說明@Bean並沒有將配置中的註入
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- RabbitMQ 實現延遲隊列的兩種方式詳解
- SpringBoot上傳臨時文件被刪除引起報錯的解決
- 詳解Spring Bean的配置方式與實例化
- SpringBoot項目如何將Bean註入到普通類中
- Spring中ClassPathXmlApplicationContext類的使用詳解