@Conditional介绍

首先我们先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可以注入到Spring IOC容器中。

  • 作用:根据是否满足某一个特定条件来决定是否创建某个特定的Bean
  • 意义:Springboot实现自动配置的关键基础能力
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {/*** All {@link Condition Conditions} that must {@linkplain Condition#matches match}* in order for the component to be registered.*/Class<? extends Condition>[] value();}

从注解的定义我们可以看到,使用该注解我们需要传入的是一个Class数组,并且这些Class必须实现Condition接口,Condition接口定义如下:

@FunctionalInterface
public interface Condition {/*** Determine if the condition matches.* @param context the condition context* @param metadata metadata of the {@link org.springframework.core.type.AnnotationMetadata class}* or {@link org.springframework.core.type.MethodMetadata method} being checked* @return {@code true} if the condition matches and the component can be registered,* or {@code false} to veto the annotated component's registration*/boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}

实现Condition接口必须实现matches方法,matches方法由子类实现(判断条件是否匹配)返回true,代表@Conditional注解的Bean可以被注入到Spring IOC容器,返回false,@Conditional注解的Bean就不会被注入到Spring IOC容器。

spirngboot中常用的@Conditional注解

  • @ConditionalOnBean(存在某个bean的时候实例化)
  • @ConditionalOnMissingBean(不存在某个bean的时候实例化)
  • @ConditionalOnClass(存在某个类时,才会实例化一个Bean)
  • @ConditionalOnSingleCandidate(指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean)
  • @ConditionalOnMissingClass(不存在某个类时,才会实例化一个Bean)
  • @ConditionalOnWebApplication(如果是Web应用)
  • @ConditionalOnProperty(控制配置类是否生效)
  • @ConditionalOnNotWebApplication(如果不是Web应用)
  • @ConditionalOnJava(如果是Java应用)
  • @ConditionalOnResource(对指定资源进行校验)

我们来看看@ConditionalOnBean注解

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean {...
}

@Conditional(OnBeanCondition.class),那么OnBeanCondition这个类应该实现了Condition

具体逻辑不细究,我们可以自己实现一个这样的注解。

自定义

实现步骤

  • 编写注解类,类上标注@Conditional的实现
import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface MyConditionAnnotation {String[] value() default {};}
  • Conditional的实现类
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.StringUtils;public class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {/*** 获取注解值*/String[] properties = (String[])metadata.getAnnotationAttributes("com.bushro.condi.MyConditionAnnotation").get("value");for (String property : properties) {//环境变量中有这些变量则匹配成功if (StringUtils.isEmpty(context.getEnvironment().getProperty(property))) {return false;}}return true;}
}
  • 配置使用
@Component
@ConfigurationProperties(prefix = "bushro")
@MyConditionAnnotation({"test1", "test2"})
public class MyConfig {private String condition;public String getCondition() {return condition;}public void setCondition(String condition) {this.condition = condition;}
}

application.properties配置

bushro.condition=test
test1=xxx
test2=xxx
  • 测试看能不能获取到MyConfig这个bean,然后去掉test1的配置再试试
    @Testpublic void testA() {MyConfig bean = applicationContext.getBean(MyConfig.class);System.out.println(bean.getCondition());}

SpringBoot之conditional注解相关推荐

  1. @data注解_聊一下@Conditional注解系列的作用

    欢迎大家关注我的微信公众号,码猿Bug,或者扫描下方二维码,有需要资料的可以随时联系我 http://weixin.qq.com/r/qig7I1LEOw9ErRZA9324 (二维码自动识别) 今天 ...

  2. SpringBoot conditional注解和自定义conditional注解使用

    conditional注解是Springboot starter的基石,自动装配的时候会根据条件确定是否需要注入这个类. 含义:基于条件的注解. 作用:根据是否满足某个特定条件来决定是否创建某个特定的 ...

  3. springboot中的@Conditional注解

    springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...

  4. 一篇文章教你读懂Spring @Conditional注解

    文章目录 一.Conditional简介 二.Conditional用法 1.Conditonal注解作用在方法上 2.Conditonal注解作用在类上 3.类上注入多个条件类 三.Conditio ...

  5. SpringBoot的@Conditional和自动配置类生效

    @Conditional原理    在之前的博客中提到了关于自动配置的原理,但是在自动配置的时候有很多的判断,只有当这些判断都成功之后在自动配置的时候才会成功.但是我们会发现一个问题,当我们使用@Be ...

  6. 12、常见Conditional注解源码解析(ok)

    参考资料:彻底搞定 Java 注解 Spring Boot中所有的@Conditional 注解如下: Conditional (o.s.context.annotation)|-Conditiona ...

  7. SpringBoot--自动装配原理详解及应用之Conditional注解

    SpringBoot作为当今开发的主流框架,作为一名java开发是不可能的不了解的,这个东西是典型的用起来很简单,但是了解到原理之后就会不自觉地感叹,真TMNB! 本文主要讲解其自动装配的原理,以及我 ...

  8. Spring @Conditional注解 详细讲解及示例

    前言: @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. @Conditional的定义: //此注解可以标注在类和方法上 @Tar ...

  9. 【Spring注解】@Conditional注解的使用

    前言 @Conditional注解的判断条件,决定了该类是否可以成为Bean.即使该类被@Component注解修饰,@Conditional条件是false,那么该类也不会注入到IOC容器中.且该注 ...

最新文章

  1. EBS R12中如何使用CGI登录Form
  2. Generator-ing Values
  3. 居民信息管理系统java_基于jsp的社区住户信息管理系统-JavaEE实现社区住户信息管理系统 - java项目源码...
  4. localtime与localtime_r
  5. Autofac的AOP面向切面编程研究
  6. 11 个简练的 Java 性能调优技巧
  7. 关于ANTLR的通用库的需求:使用反射来构建元模型
  8. torchtext处理文本数据——构造dataset读取文本(学习一)
  9. 使用LazZiya.ExpressLocalization开发多区域性ASP.NET Core 3、2、1项目
  10. Bailian4134 查找最接近的元素【二分查找】
  11. Linux课程第二十四天学习笔记
  12. AspNet2.0的QuickStart出了
  13. 《SVN web管理工具CollabNetSubversionEdge》
  14. 什么情况下使用10分钟邮箱?8个临时邮箱推荐
  15. EXCEL 统计每日订单量(拉勾教育数据分析实战训练营学习笔记)
  16. oracle创建存储过程报错,oracle创建了存储过程,在PLSQL @路径 执行后报错
  17. window计算机桌面的组成,Windows 10桌面的组成,Win10桌面介绍
  18. 开源项目zheng运行环境
  19. 【错误解决】System.NotSupportedException:“LINQ to Entities does not recognize the method
  20. Python代码篇-单例模式(五种实现单利方式)

热门文章

  1. linux 定时执行php文件
  2. 人际交往能力远比你想象的重要
  3. 几款自动驾驶测试模拟仿真平台
  4. 程序员来聊一聊信用卡(四)——哪些银行的哪些卡容易办、值得办
  5. CESIUM离线三维地球发布教程
  6. Android中为PopupWindow设置半透明背景的方案(兼容华为手机)
  7. 高标准,硬实力,vivo如何保卫移动终端数据安全?
  8. git 命令操作手册大全
  9. 【Unity Shader】UI特效在RawImage上使用运行良好,但是在Image上则不是预期效果的问题
  10. windows系统go环境配置