本篇文章给大家带来的内容是关于springboot中@conditional注解是什么?怎么用?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
最近项目中使用到了关于@Conditional注解的一些特性,故写此文记录一下
@Conditional是啥呀?
@Conditional注解是个什么东西呢,它可以根据代码中设置的条件装载不同的bean,比如说当一个接口有两个实现类时,我们要把这个接口交给Spring管理时通常会只选择实现其中一个实现类,这个时候我们总不能使用if-else吧,所以这个@Conditional的注解就出现了。
我怎么用它呢?
在SpringBoot中,@Conditional注解并不是孤军奋斗,它们是一个家族,我们来看一下它们其中的几个成员,又都是怎么用的
@ConditionalOnBean
示例代码
@Bean @ConditionalOnBean(RedisConnectionFactory.class) public RedisTemplate
这个方法上加了@ConditionalOnBean注解,注解里的属性是RedisConnectionFactory。它的意思呢,就是说如果你配置了redis的相关配置信息那么我就实例化RedisTemplate供你进行操作,如果你没有配置redis的相关配置那么我就不实例化(毕竟没有配置实例化也报错不是)
不仅如此,你也可以这样玩:
根据bean的名字@ConditionalOnMissingBean(name = “connectionFactory”)或者@ConditionalOnMissingBean(annotation = EnableSyjRateLimit.class)根据注解等等骚操作都可以
@ConditionalOnMissingBean
这个仅仅比1多了个Missing,啥意思呢,见名知意,就是不存在某个bean的时候实例化。@ConditionalOnClass(存在某个类时,才会实例化一个Bean)
@ConditionalOnMissingClass(不存在某个类时,才会实例化一个Bean)
TP-COUPON 导购系统 免费版下载自从百度屏蔽淘宝客网站、淘宝抛弃淘宝客之后,个人站长集体陷入了恐慌之中。此时,什么值得买网的异军突起引起了广大个人站长的极大关注。做一个什么值得买一样的导购网站成了众多个人站长的一致心愿! TP-COUPON 导购系统 即是让个人站长实现此心愿的绝佳选择! 欢迎个人站长选用。V1.1版 更新记录:1.修正请求时查询淘宝店铺错误的bug2.删除一些无用的代码
@ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “token”)
这个就稍微复杂了一点,它的意思呢就是当存在配置文件中以syj为前缀的属性,属性名称为algorithm,然后它的值为token时才会实例化一个类。
而且这个还有一个比较好的属性
@ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “counter”, matchIfMissing = true)
matchIfMissing的意思呢就是说如果所有的都不满足的话就默认实现,不管这个属性syj.algorithm是不是等于counter@ConditionalOnJava(如果是Java应用)
@ConditionalOnWebApplication(如果是Web应用)
其实说到这@Conditional家族的成员我们只讲了其中的一小部分
它的家族成员大概有这么多:
想要深入了解的童鞋可以参考一下这个包
org.springframework.boot.autoconfigure.condition
虽然上边你讲了很多,但是我还是不满意
为什么不满意呢,其实原因有很多,比如说你没有用过SpringBoot,在比如说你想自定义。那这个时候怎么办呢,那咱们就来自定义一个。
首先自定义一个规则类
public class MyCondition implements Condition
{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
{
//在这里写你的逻辑,比如说你想a>0时实例化类A,a<0时不实现
return a>0;
}
}
然后你就可以用了
@Bean
@Conditional(MyCondition.class)
public A a(){
return new A()
}









