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

 更新时间:2021年06月22日 10:07:59   作者:从心归零  
这篇文章主要介绍了如何使用@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并没有将配置中的注入

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea中项目文件目录消失如何解决

    idea中项目文件目录消失如何解决

    这篇文章主要介绍了idea中项目文件目录消失的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java弱键集合WeakHashMap及ConcurrentCache原理详解

    Java弱键集合WeakHashMap及ConcurrentCache原理详解

    这篇文章主要介绍了Java弱键集合WeakHashMap及ConcurrentCache原理详解,基于哈希表的Map接口实现,支持null键和值,但是WeakHashMap具有弱键,可用来实现缓存存储,在进行GC的时候会自动回收键值对,需要的朋友可以参考下
    2023-09-09
  • IDEA2020.3创建web工程的完整步骤

    IDEA2020.3创建web工程的完整步骤

    这篇文章主要给大家介绍了关于IDEA2020.3创建web工程的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Jmeter设置全局变量token过程图解

    Jmeter设置全局变量token过程图解

    这篇文章主要介绍了Jmeter设置全局变量token过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 浅析Spring4新特性概述

    浅析Spring4新特性概述

    Spring 4.1并没有特别吸引眼球的地方,主要还是增强和一些依赖的版本升级。本文重点给大家介绍Spring4新特性概述,感兴趣的朋友一起看看吧
    2017-09-09
  • Java文件操作之按行读取文件和遍历目录的方法

    Java文件操作之按行读取文件和遍历目录的方法

    这篇文章主要介绍了Java文件操作之按行读取文件和递归遍历目录的方法,遍历目录文中分别举了递归和非递归的例子,需要的朋友可以参考下
    2016-03-03
  • drools规则动态化实践解析

    drools规则动态化实践解析

    这篇文章主要为大家介绍了drools规则动态化实践解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • SpringBoot浅析Redis访问操作使用

    SpringBoot浅析Redis访问操作使用

    Redis是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与多种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能
    2022-11-11
  • 你知道Spring如何解决所有循环依赖的吗

    你知道Spring如何解决所有循环依赖的吗

    这篇文章主要来和大家聊聊Spring 能解决所有循环依赖吗,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的小伙伴可以参考一下
    2023-07-07
  • mybatis如何批量添加一对多中间表

    mybatis如何批量添加一对多中间表

    这篇文章主要介绍了mybatis如何批量添加一对多中间表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论