• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

java 搞代码 4年前 (2022-01-09) 21次浏览 已收录 0个评论
文章目录[隐藏]

@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.<p>本文来源gao!%daima.com搞$代*!码$网9</p>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并没有将配置中的注入

以上为个人经验,希望能给大家一个参考,也希望大家多多支持搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何使用@ConditionalOnExpression决定是否生效注释

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址