简介

@ConditionalSpring 框架中用于条件化注册 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。例如,如果某个配置项被设置为特定值,则创建相应的 BeanSpring 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. CICD:持续集成、持续交付、持续部署-基础概念

    一.简介 CI / CD的采用改变了开发人员和测试人员如何发布软件. 最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线.随着DevOps的兴起,出现了持续集 ...

  2. 火了整个春节的DeepSeek,他对AI产品的意义到底是什么?

    相信春节期间各位的朋友圈一定被DeepSeek"轰炸"了,就算是普通人也获得了一些信息:国内AI取得了巨大突破. 但DeepSeek这次突破到底对一般的互联网从业者有什么帮助,绝大 ...

  3. 从挑战到突破:HBlock定义智算存储新范式!

    近日,由DOIT传媒主办,中国计算机学会信息存储专委会.武汉光电国家研究中心.百易存储研究院支持的2024中国数据与存储峰会在北京召开.此次峰会以"智数据 AI未来"为主题,天翼云 ...

  4. 深入剖析Base64加解密中遇到的坑点

    前言 最近开发过程中遇到了关于使用base64加密传输遇到的神奇问题.需求就是用户的id在链接上露出时需要加密处理,于是后端把下发的用户id改成了base64加密处理后下发了,前端只需要把加密后的用户 ...

  5. Net跨平台硬件信息查询库 Hardware.Info:全面获取系统硬件详情

    Hardware.Info 是一个基于 .NET Standard 2.0 的跨平台库,提供了硬件信息查询的功能,支持 Windows.Linux 和 macOS 操作系统.该库通过不同平台下的系统接 ...

  6. java list集合去重的两种方式

  7. MySQL - [09] 正则表达式

    转载:https://mp.weixin.qq.com/s/7RavuYGs9SthX2pxGJppqw select * from t1 where name rlike '^[a-zA-Z]+$' ...

  8. Linux - 安装JDK(.tar.gz)

    1.上传 jdk-8u351-linux-x64.tar.gz 到 /opt/module 目录下并解压 tar -zxvf jdk-8u351-linux-x64.tar.gz -C /opt/mo ...

  9. MySQL Q&A - [02] windows上MySQL的安装路径变更之后无法启动MySQL服务

    参考:https://blog.csdn.net/weixin_45271005/article/details/130091868 Step1:首先,变更之前,需要保证MySQL服务是停止运行的 S ...

  10. C#/.NET/.NET Core技术前沿周刊 | 第 27 期(2025年2.17-2.23)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...