• SpringBoot条件注解@Conditional


    最近项目中使用到了关于@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,转载请保留。

  • 相关阅读:
    不死神兔
    C/C++内存管理详解
    python下调用不在环境变量中的firefox
    【转至nmap】nc命令
    Linux SSH隧道技术(端口转发,socket代理)
    linux共享上网设置
    HDU
    CSU
    HDU
    HDU
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9703736.html
Copyright © 2020-2023  润新知