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

SpringBoot条件注解@Conditional的更多相关文章

  1. [读书笔记] 二、条件注解@Conditional,组合注解,元注解

    一.条件注解@Conditional,组合注解,元注解 1. @Conditional:满足特定条件创建一个Bean,SpringBoot就是利用这个特性进行自动配置的. 例子: 首先,两个Condi ...

  2. Spring Boot实战笔记(八)-- Spring高级话题(条件注解@Conditional)

    一.条件注解@Conditional 在之前的学习中,通过活动的profile,我们可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解 ...

  3. springboot自动装配(3)---条件注解@Conditional

    之前有说到springboot自动装配的时候,都是去寻找一个XXXAutoConfiguration的配置类,然而我们的springboot的spring.factories文件中有各种组件的自动装配 ...

  4. Spring_总结_04_高级配置(二)_条件注解@Conditional

    一.前言 本文承接上一节:Spring_总结_04_高级配置(一)之Profile 在上一节,我们了解到 Profile 为不同环境下使用不同的配置提供了支持,那么Profile到底是如何实现的呢?其 ...

  5. 条件注解@Conditional

    通过活动的profile,可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditonal注解 @Conditional根据满足某一个特定条件创建一个特定 ...

  6. Springboot 条件注解

    @Conditional 根据满足某一个特定条件创建一个特定的 Bean.就是根据特定条件来控制 Bean 的创建行为,这样我们可以利用这个特性进行一些自动的配置 Springboot 中大量用到了条 ...

  7. Spring条件注解@Conditional

    @Conditional是Spring4新提供的注解,它的作用是根据某个条件创建特定的Bean,通过实现Condition接口,并重写matches接口来构造判断条件.总的来说,就是根据特定条件来控制 ...

  8. 通过条件注解@Conditional细粒度的选择bean实例

    在进行spring进行开发时,当某个接口有多种实现方式并且我们只想让一种生效时,比如声明如下一个接口和两个实现: public interface LanggageService { String s ...

  9. Spring知识点回顾(06)Profile 和 条件注解 @Conditional

    1.设定环境中的active profiles 如:DispatcherServerlet的init-param spring.profiles.active=production spring.pr ...

随机推荐

  1. NoteBook学习(二)-------- Zeppelin简介与安装

    Zeppelin官网地址: http://zeppelin.apache.org/ Github地址: https://github.com/apache/zeppelin (参照官网) 1.什么是z ...

  2. Pyjwt ,python jwt ,jwt

    pip install Pyjwt 不错的jwt 文章: https://www.cnblogs.com/wayneiscoming/p/7513487.html Sampleimport jwt i ...

  3. gitlab 误关闭sign-in

    sudo gitlab-rails console ApplicationSetting.last.update_attributes(password_authentication_enabled_ ...

  4. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  5. 使用DOS命令无法启动MySQL

    今天使用命令dos 命令 net start mysql 启动mysql的使用出现以下情况 无法正常启动mysql服务. 原因是: 启动dos命令窗口时的用户权限太低,无法正常使用 解决办法: 搜索c ...

  6. vue项目中编写一个图片预览的公用组件

    今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...

  7. .NET core RSA帮助类

    解决 Operation is not supported on this platform 异常 直接上代码: public class RSAHelper { /// <summary> ...

  8. bittorrent 学习(二) LOG日志和peer管理连接

    代码中的log.h log.c比较简单 void logcmd() 记录命令  int logfile();运行日志的记录 int init_logfile() 开启log文件 源码比较清晰也很简单. ...

  9. C#将结构体和指针互转的方法

    . 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库 命名空间:System.Runtime.InteropServices 程序集:mscorlib(在 msc ...

  10. P2634 [国家集训队]聪聪可可

    淀粉质 第二道点分治的题 关于点分治的一点理解: 所谓点分治,其实就是把要求的问题(一般与路径有关)划分成两种情况 1.路径经过rt(根节点) 2.路径在根节点的子树内 我们只需要处理情况1,因为情况 ...