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

@Conditional是啥呀?

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

我怎么用它呢?

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

  1. @ConditionalOnBean
    示例代码
1
2
3
4
5
6
7
8
9
@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. 首先自定义一个规则类
1
2
3
4
5
6
7
8
9
public class MyCondition implements Condition    
{ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
{
//在这里写你的逻辑,比如说你想a>0时实例化类A,a<0时不实现
return a>0;
}
}
  1. 然后你就可以用了
1
2
3
4
5
@Bean
@Conditional(MyCondition.class)
public A a(){
return new A()
}

看看别人怎么用的

相信看完上方的几步你已经学会了如何跟@Conditional家族打招呼了。那么你愿意来看一下我是怎么用的么?
https://github.com/2388386839/syj-ratelimit

本文出自http://zhixiang.org.cn,转载请保留。

最新文章

  1. MVC5 Entity Framework学习之Entity Framework高级功能(转)
  2. Java集合类学习笔记(List集合)
  3. 深入理解CSS径向渐变radial-gradient
  4. ajax操作时用于提高用户体验的两段备用代码
  5. Linux(centOS6.5)下SVN的安装、配置及开机启动
  6. Creating List Item in Oracle D2k
  7. Linux下smba服务端的搭建和客户端的使用
  8. 【采集】php str_replace
  9. 抓包分析TCP的三次握手和四次分手
  10. Parse error: syntax error, unexpected T_PUBLIC in 问题解决
  11. bzoj1251 序列终结者(Splay Tree+懒惰标记)
  12. zoj 3822 Domination(2014牡丹江区域赛D称号)
  13. asp.net 自定义的模板方法接口通用类型
  14. url的解码方式
  15. 后端分布式系列:分布式存储-HDFS NameNode 设计实现解析
  16. 《Linux内核设计与实现》第三章读书笔记
  17. mysql对emoji的支持
  18. android activity lifecycle
  19. A Benchmark Comparsion of Monocular Visual-Inertial Odometry Algorithms for Flying Robots论文笔记
  20. Sublime 中文标题乱码

热门文章

  1. sqlserver 3145
  2. exl表格找两个字符间的数据
  3. Git多账号配置,同一电脑多个ssh-key的管理
  4. Rendering Problems Couldn&#39;t resolve resource @dimen/y20
  5. 在centos7 部署bbr
  6. 3wwang的2019计划
  7. rpm --rebuilddb
  8. HDU4521
  9. Oracle中特殊的变量类型
  10. 直播流RTMP 知识