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

网友投稿 258 2023-01-04

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

UikRdOYlTC

就行啦~

@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并没有将配置中的注入

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网站api接口调用教程(api接口调用网站源码)
下一篇:基于rocketmq的有序消费模式和并发消费模式的区别说明
相关文章

 发表评论

暂时没有评论,来抢沙发吧~