欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot条件注解@Conditional

程序员文章站 2022-05-03 14:00:56
最近项目中使用到了关于@Conditional注解的一些特性,故写此文记录一下 @Conditional是啥呀? @Conditional注解是个什么东西呢,它可以根据代码中设置的条件装载不同的bean,比如说当一个接口有两个实现类时,我们要把这个接口交给Spring管理时通常会只选择实现其中一个实 ......

最近项目中使用到了关于@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家族的成员我们只讲了其中的一小部分
    它的家族成员大概有这么多:
    SpringBoot条件注解@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家族打招呼了。那么你愿意来看一下我是怎么用的么?

本文出自,转载请保留。