前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot条件注解@Conditional

SpringBoot条件注解@Conditional

作者头像
Java学习录
发布2019-04-18 14:28:39
6460
发布2019-04-18 14:28:39
举报
文章被收录于专栏:Java学习录

学习更多Java干货,戳上面的

蓝色字题

关注我!

最近项目中使用到了关于@Conditional注解的一些特性,故写此文记录一下

@Conditional是啥呀?

@Conditional注解是个什么东西呢,它可以根据代码中设置的条件装载不同的bean,比如说当一个接口有两个实现类时,我们要把这个接口交给Spring管理时通常会只选择实现其中一个实现类,这个时候我们总不能使用if-else吧,所以这个@Conditional的注解就出现了。

我怎么用它呢?

在SpringBoot中,@Conditional注解并不是孤军奋斗,它们是一个家族,我们来看一下它们其中的几个成员,又都是怎么用的

  1. @ConditionalOnBean 示例代码
代码语言:javascript
复制
@Bean@ConditionalOnBean(RedisConnectionFactory.class)   public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {       RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();       template.setConnectionFactory(connectionFactory);       template.setKeySerializer(new StringRedisSerializer());       template.afterPropertiesSet();       return template;   }

这个方法上加了@ConditionalOnBean注解,注解里的属性是RedisConnectionFactory。它的意思呢,就是说如果你配置了redis的相关配置信息那么我就实例化RedisTemplate供你进行操作,如果你没有配置redis的相关配置那么我就不实例化(毕竟没有配置实例化也报错不是) 不仅如此,你也可以这样玩: 根据bean的名字@ConditionalOnMissingBean(name = “connectionFactory”)或者 @ConditionalOnMissingBean(annotation = EnableSyjRateLimit.class)根据注解等等骚操作都可以

  1. @ConditionalOnMissingBean 这个仅仅比1多了个Missing,啥意思呢,见名知意,就是不存在某个bean的时候实例化。
  2. @ConditionalOnClass(存在某个类时,才会实例化一个Bean)
  3. @ConditionalOnMissingClass(不存在某个类时,才会实例化一个Bean)
  4. @ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “token”) 这个就稍微复杂了一点,它的意思呢就是当存在配置文件中以syj为前缀的属性,属性名称为algorithm,然后它的值为token时才会实例化一个类。 而且这个还有一个比较好的属性 @ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “counter”, matchIfMissing = true) matchIfMissing的意思呢就是说如果所有的都不满足的话就默认实现,不管这个属性syj.algorithm是不是等于counter
  5. @ConditionalOnJava(如果是Java应用)
  6. @ConditionalOnWebApplication(如果是Web应用) 其实说到这@Conditional家族的成员我们只讲了其中的一小部分 它的家族成员大概有这么多:

想要深入了解的童鞋可以参考一下这个包 org.springframework.boot.autoconfigure.condition

虽然上边你讲了很多,但是我还是不满意

为什么不满意呢,其实原因有很多,比如说你没有用过SpringBoot,在比如说你想自定义。那这个时候怎么办呢,那咱们就来自定义一个。

  1. 首先自定义一个规则类
代码语言:javascript
复制
public class MyCondition implements Condition    {              public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)    {            //在这里写你的逻辑,比如说你想a>0时实例化类A,a<0时不实现        return a>0;        }    }
  1. 然后你就可以用了
代码语言:javascript
复制
@Bean    @Conditional(MyCondition.class)    public A a(){      return new A()    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • @Conditional是啥呀?
  • 我怎么用它呢?
  • 虽然上边你讲了很多,但是我还是不满意
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档