使用@ConditionalOnExpression决定是否生效注释

本文介绍如何通过配置文件实现消息队列如RocketMQ和RabbitMQ的动态切换,重点讲解了使用Spring Boot的@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}==1&&${rabbitmq.comsumer.enabled:true}")

布尔值和数字都还好说,但是字符串相等我搞了半天都不行,最后终于找到了资料

https://www.e-learn.cn/content/wangluowenzhang/357851?q=content%2Fwangluowenzhang%2F357851

 

#选择消费者,rocketmq,rabbitmq
mq.comsumer=rabbitmq
@Component
@RabbitListener(queues = "monitorDataQueue")
@ConditionalOnExpression("'${mq.comsumer}'.equals('rabbitmq')")

 

### 原理 `@ConditionalOnExpression` 是 Spring Boot 基于 `@Conditional` 注解提供的特定场景条件注解,当 SpEL 表达式为 `true` 时生效,属于基于表达式的条件注解 [^1]。 在 Spring 容器解析 Bean 定义时,而非创建 Bean 实例时,遇到带有 `@Conditional` 注解的组件,`ConfigurationClassPostProcessor` 处理配置类,使用 `ConditionEvaluator` 判断条件,调用每个 `Condition` 实现类的 `matches()` 方法进行条件检查,只有所有条件都满足,才会注册 Bean 定义到容器中 [^2]。对于 `@ConditionalOnExpression`,就是检查 SpEL 表达式的计算结果是否为 `true`,若为 `true` 则注册 Bean 定义到容器中。 ### 使用方法 #### 基本使用 可以在 `@Bean` 注解的方法上使用 `@ConditionalOnExpression` 注解,根据配置文件中的属性值来决定是否创建 Bean。 示例配置文件 `application.properties`: ```properties myapp.feature.enabled=true ``` 示例代码: ```java import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyConfig { @Bean @ConditionalOnExpression("${myapp.feature.enabled}") public MyService myService() { return new MyService(); } } class MyService { // 服务类的具体实现 } ``` 在上述示例中,`@ConditionalOnExpression` 注解的表达式 `${myapp.feature.enabled}` 会从配置文件中获取 `myapp.feature.enabled` 属性的值,若该值为 `true`,则创建 `MyService` Bean。 #### 复杂表达式使用 可以使用更复杂的 SpEL 表达式,结合逻辑运算符等进行条件判断。 示例配置文件 `application.properties`: ```properties myapp.value=10 myapp.threshold=5 ``` 示例代码: ```java import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ComplexConfig { @Bean @ConditionalOnExpression("${myapp.value} > ${myapp.threshold}") public ComplexService complexService() { return new ComplexService(); } } class ComplexService { // 服务类的具体实现 } ``` 在这个示例中,`@ConditionalOnExpression` 注解的表达式 `${myapp.value} > ${myapp.threshold}` 会比较配置文件中 `myapp.value` 和 `myapp.threshold` 的值,若 `myapp.value` 大于 `myapp.threshold`,则创建 `ComplexService` Bean。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值