简介

@Conditional 是 Spring 框架中用于条件化注册 Bean的核心注解,它允许开发者根据特定条件决定是否将某个Bean注册到 Spring 容器中。这一机制在实现多环境配置、模块化加载、动态依赖管理等场景中非常有用。

作用

  • 条件控制:根据预设条件(如环境变量、类路径、系统属性等)动态决定是否创建并注册Bean。

  • 灵活配置:避免硬编码配置,使应用能自适应不同的运行环境。

  • 模块配置:通过条件控制模块的加载,例如仅在启用某些功能时注册相关Bean。

实现

  1. 定义条件类:实现 org.springframework.context.annotation.Condition 接口,并重写其 matches 方法。在这个方法中,你可以定义判断条件的逻辑。如果条件满足,则返回 true;否则返回 false。
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata; public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 在这里实现你的条件逻辑
// 返回 true 表示条件满足,Spring 将会创建该 Bean;反之则不创建。
// 示例:假设我们只在系统属性 "my.condition" 设置为 "enabled" 时创建 Bean
String conditionValue = System.getProperty("my.condition");
return "enabled".equals(conditionValue);
}
}
  1. 使用 @Conditional 注解:在你想要有条件的创建的 Bean 上添加 @Conditional 注解,并指定你在第一步中定义的条件类。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; @Configuration
public class MyConfiguration { @Bean
@Conditional(MyCondition.class) // 指定自定义的条件类
public MyService myService() {
return new MyServiceImpl();
}
}
  1. 可以结合自定义注解,实现更为丰富的自定义功能
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import org.springframework.context.annotation.Conditional; // 定义注解的作用目标和生命周期
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Conditional(MyCondition.class) // 指定条件类
public @interface ConditionalOnMyCondition {
}

原生

在Spring Boot 中,@Conditional 注解及其一系列衍生注解被广泛用于根据不同的条件来控制 Bean 的创建。Spring Boot 提供了许多预定义的条件注解,这些注解简化了基于条件的配置过程。以下是一些常见的使用场景和对应的注解:

  • @ConditionalOnClass 和 @ConditionalOnMissingClass:这些注解根据类路径中是否存在特定的类来决定是否应用某个配置或创建某个 Bean。

  • @ConditionalOnBean 和 @ConditionalOnMissingBean:基于 Spring 容器中是否存在特定类型的 Bean 来决定是否应用配置或创建新的 Bean。

  • @ConditionalOnProperty:根据配置文件中的属性值来决定是否加载某些 Bean。这对于启用或禁用特定功能非常有用。

  • @ConditionalOnResource:当指定的资源(如文件)存在于类路径中时,才加载相应的配置或 Bean。

  • @ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication:根据应用是否为 Web 应用来决定是否应用某些配置。这对于区分处理 Web 和非 Web 相关的 Bean 配置特别有用。

  • @ConditionalOnExpression:根据 SpEL 表达式的计算结果来决定是否应用配置或创建 Bean。

  • @ConditionalOnJava:基于 Java 运行时版本来决定是否应用某些配置。

  • @ConditionalOnJndi:如果 JNDI 资源存在,则应用相关配置。

  • @ConditionalOnSingleCandidate:当容器中有且仅有一个指定类型的主 Bean 时,才应用相关的配置或创建 Bean。

使用场景

  • 环境区分:在不同的环境中(如开发、测试、生产)加载不同的 Bean 实现。例如,可以基于 @Profile 注解实现这一点,但 @Conditional 提供了更灵活的方式。

  • 类存在性检查:根据某个特定类是否存在于类路径上来决定是否创建某些 Bean。这对于处理可选依赖特别有用。Spring Boot 的 @ConditionalOnClass 就是这样一个例子。

  • 属性检查:根据配置文件中的属性值来决定是否创建某个 Bean。例如,如果某个配置项被设置为特定值,则创建相应的 Bean。Spring Boot 提供了 @ConditionalOnProperty 来简化这种场景的处理。

  • 资源可用性:根据外部资源的可用性来决定是否创建 Bean。例如,只有当数据库连接可用时才创建数据访问相关的 Bean。

  • 运行时检查:基于系统属性或环境变量等运行时信息来控制 Bean 的创建。这允许应用程序根据部署环境的特性调整自身行为。

  • Bean 存在性检查:根据容器中是否已经存在某个 Bean 来决定是否创建另一个 Bean。这对于解决 Bean 之间的依赖关系很有用。

  • 自定义条件逻辑:对于一些复杂的条件判断逻辑,可以通过实现 Condition 接口来自定义条件评估逻辑,然后通过 @Conditional注解应用这些自定义条件。


结束

🎀spring @conditional介绍及使用的更多相关文章

  1. Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍

    1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...

  2. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  3. Spring 的介绍和目标

    1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...

  4. Spring的介绍与搭建

    一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试

  5. Spring @Conditional简单使用 以及 使用时注意事项一点

    @Conditional注解在类的方法中 @Conditional注解失效的一种原因 @Conditional注解在类上 手写的低配版@ConditionalOnClass Spring  @Cond ...

  6. Spring Shell介绍

    最近开发中在下遇到了spring-shell开发工具的项目,现在整理了相关文章,以供大家学习 本博客相关的文章均是在Spring Shell 1.2.0的基础上建立   Spring Shell介绍 ...

  7. Spring DevTools 介绍

    Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...

  8. 第1章—Spring之旅—Spring模块介绍

    Spring模块介绍 Spring7大核心模块: 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.S ...

  9. Spring Security 介绍与Demo

    一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...

  10. [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST,  ...

随机推荐

  1. oracle 根据节点id递归查询全部的父节点(转载)

    本文转载自   https://blog.csdn.net/BondChenJ/article/details/78581625 1.适用状况:blog 适用树状结构数据,例如包含id,parent_ ...

  2. 【SQL跟踪工具】SQL Profiler 跟踪器使用

    阅读目录 什么是SQL Profiler 为什么要使用SQL Profiler 如何使用SQL Profiler 什么是SQL Profiler SQL Server Profiler 是一个功能丰富 ...

  3. Jenkins执行Shell脚本超时错误处理指南

    Jenkins执行Shell脚本超时错误处理指南 在使用Jenkins进行自动化测试时,经常会遇到需要执行Shell脚本的情况.然而,当Shell脚本执行时间过长,超过了Jenkins配置的超时限制时 ...

  4. Yarn提交Flink任务参数介绍

    一.参数介绍 作业模式:yarn-per-job 基本参数 描述 -ynm(Custom Yarnname) 自定义的Yarn名字 -yqu 指定Yarn队列名 -yn (TaskManager)  ...

  5. Luogu P11280 GFOI Round 2 Jom & Terry 题解 [ 黄 ] [ BFS ]

    Jom & Terry:讲个笑话,我赛时被诈骗了. 思路 先放结论:如果 Terry 到终点的距离小于等于 Jom 到终点的距离,那么 Terry 一定不会被抓. 为啥呢,因为不管 Jom 堵 ...

  6. .NET Core 托管堆内存泄露/CPU异常的常见思路

    常见的思路 内存泄露 托管内存暴涨大多数原因都是因为对象被GC Root(stack,gchandle,finalizequeue)持有,所以一直无法释放,所以观察的重点都在对象的可疑GC Root ...

  7. 天线增益是什么意思?DBI越大越好吗?

    作者: 技象物联网/ 行业百科 / 无线通信, 通信系统 / 2023年6月23日 11:58:21 天线增益是指天线在某个方向上相对于一个理想点源天线所辐射的功率密度的增益.换句话说,天线增益是天线 ...

  8. 设计原则&模式:单例模式(创建型)

    定义:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式. 五种实现方式: 饿汉式 懒汉式 双重校验 静态内部类 枚举类 饿汉式 特点:线程安全,调用效率高,但是不 ...

  9. Java 浮点型去除后面多余的零

    当我们输出的小数不知道有几位小数,也不知道后面有没有带零,去掉后面多余零可以采用以下方法.在实际使用中,多用于小数转百分数,百分数前面的小数乘以100后转String输出,输出的String很多带零, ...

  10. JS数组相减

    const arr1 = [1, 2, 3] const arr2 = [1, 3] const arr3 = arr1.filter(v => !arr2.includes(v)) // [2 ...