如何使用@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。

推薦閱讀: