@Conditional 是条件装配注解,它的作用是当装配bean时,首先要按照一定条件去判断,只有满足条件才会将bean注册到容器。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {Class<? extends Condition>[] value();
}

注解中只有一个class类型的属性,这个 class 便是需要实现条件判断的类,这个类必须实现 Condition 接口的 matches 方法,该方法会返回一个boolean类型值,通过这个值来判断条件是否成立。

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);}

Conditional相关的其它注解:

注解名称 描述
@ConditionalOnBean 在某个 bean 存在的时候
@ConditionalOnMissingBean 在某个 bean 不存在的时候
@ConditionalOnClass 当前 classPath 下可以找到某个 class 的时候
@ConditionalOnMissingClass 当前 classPath 下无法找到某个 class 的时候
@ConditionalOnResource 当前 classPath 下是否存在某个资源文件
@ConditionalOnProperty 当前 JVM 是否包含某个属性值
@ConditionalOnWebApplication 当前 Spring context 是否是 web 应用程序

SPI

条件装配除了通过@Conditional 相关注解声明,还可以使用 SPI 的方式声明。

在 META-INF/spring-autoconfigure-metadata.properties 配置以下内容:

com.test.TestConfig.ConditionalOnClass=com.test.TestClass

这样一来,只有 com.test.TestClass 类存在的情况,才会加载 com.test.TestConfig 配置类。

Spring 在通过 AutoConfigurationImportSelector 加载 spring.factories 配置之前,会先扫描 spring-autoconfigure-metadata.properties 文件,从而过滤掉不满足条件的配置类。

SpringBoot @Conditional相关推荐

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

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

  2. SpringBoot @Conditional系列注解

    目录 @ConditionalOnClass.@ConditionalOnMissingClass @ConditionalOnBean.@ConditionalOnMissingBean @Cond ...

  3. SpringBoot @Conditional的使用

    结构说明 hello-spring-boot-starter: 没什么用,引用了autoconfigure模块 hello-spring-boot-starter-autoconfigure: 主要的 ...

  4. SpringBoot - @Conditional

    @Conditional @Conditional注解可以参考Spring学习中的@Conditional,参考地址:https://blog.csdn.net/qq_27062249/article ...

  5. SpringBoot 自动配置

    Springboot 自动配置 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 Springboot 是什么呐? 我管她是什么,好用就行了啊!!! spring ...

  6. java.lang.ClassNotFoundException:org.springframework.transaction.TransactionException

    使用Spring 3开发Quartz,并遇到以下错误消息. Caused by: java.lang.NoClassDefFoundError: org/springframework/transac ...

  7. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  8. SpringBoot @Configuration •@Import •@Conditional•@ImportResoure基本使用

    一.@Configuration 基本使用 Full模式与Lite模式 • 示例 • 最佳实战 • 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断 • 配置 类组件之间有依赖关系, ...

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

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

最新文章

  1. devkit_如何使用NodeMCU Devkit和Firebase数据库开始物联网
  2. linux硬盘目录下,Linux 新添加的硬盘格式化并挂载到目录下
  3. 【JSP EL表达式】动态表达式/表达式拼接
  4. SAP Spartacus B2B Org Unit树状结构的加载机制
  5. Kestrel的ListenAnyIP和ListenLocalhost的区别
  6. Elasticsearch使用REST API实现全文检索
  7. 更改文件和目录(及子目录)的拥有者
  8. 网页统计所用到的名词解析
  9. 什么是客户旅程_为什么记录您的旅程将导致开发人员成功
  10. 分析sql字段_全面解析一条SQL语句执行得很慢的原因有哪些
  11. 黑苹果Mojave下驱动高通模块Atheros DHXA-195(AR9285无线网卡和AR3011 蓝牙3.0)
  12. 浅谈ACL在校园网中的应用
  13. [Java]一个WiFi管理器(获取WiFi连接的网关的ip和信息)和热点管理器(获取连接本机的热点的设备的ip、MAC和信息)
  14. 2022年京东618活动规则:618满减规则为299减50
  15. AutoJs学习-2048全自动
  16. 洛谷P5594-【XR-4】模拟赛(模拟)
  17. java企业排班系统企业考勤人脸识别考勤系统源码企业批量排班网站
  18. XML - XML学习/XML文件解析器(C++)实现
  19. 丢掉迅雷,1M的下载神器让你下载飞起来,NDM/XDM分享
  20. [转帖]计较,是贫穷的开始 鸡汤...

热门文章

  1. 问题记录——the specified group[${xxx}] contains illegal characters, allowing only ^[%|a-zA-Z0-9_-]+$
  2. 中国汽车品牌口碑榜之:--2013年第3季度福州商用车综合口碑排名
  3. 机器学习笔试面试题——day3
  4. 东莞有哪些点餐系统服务商?东莞点菜软件哪家好?
  5. 湖南省经济贸易学校计算机,湖南省经济贸易职业中专学校2021年招生简介
  6. 某宝x-sign签名分析-商品详情接口
  7. C++ Primer中文版(第5版)
  8. 2021年清华大学MEM考研复试真题分享
  9. 欢迎加入QQandroid群,群号【60591330】
  10. LeetCode——209.长度最小的子数组