简介

@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. Dicom C-move 请求QR服务

    个人理解 Dicom C-get 就是在没有设置任何验证情况下请求QR服务,而C-move是有验证的情况下请求QR服务.一般都是C-move,因为机器都需要验证. Dicom C-move 原理:自己 ...

  2. idea+maven打包.jar发布项目

    开发完项目后,idea+maven环境打包成.jar包,才能发布项目.下面记录常用的几种打包方式. 一,通过mvn命令打包 比较专业的用法是通过mvn命令打包: mvn clean package - ...

  3. Flu PG walkthrough Intermediate

    nmap ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.192.41 Starting Nmap 7.94SVN ( https:// ...

  4. 2025年这些实用的C#/.NET知识点你都知道吗?

    前言 在这个快速发展的技术世界中,时常会有一些重要的知识点.信息或细节被忽略或遗漏.<C#/.NET/.NET Core拾遗补漏>专栏我们将探讨一些可能被忽略或遗漏的重要知识点.信息或细节 ...

  5. 硬件设计:POE--POE受电设备(PD)电路工作原理

    参考资料:解决POE PD设计挑战的有效的解决方案 POE电源模块的介绍特性和芯片的详细资料概述 如何应对PoE受电设备设计挑战 以太网供电中受电设备的芯片设计与研究 以太网供电检测和分级接口电路设计 ...

  6. Iceberg常用命令

    一.登录spark客户端 spark-sql --master yarn \ --deploy-mode client \ --queue default \ --name wang \ --driv ...

  7. Nginx~启动!!

    前言 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.r ...

  8. Edge、谷歌浏览器默认下载器开启多线程下载

    浏览器默认下载器开启多线程下载 Chrome 浏览器,地址栏输入并回车: chrome://flags/#enable-parallel-downloading Edge 新版浏览器,地址栏输入并回车 ...

  9. FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 🚀

    title: FastAPI 参数别名与自动文档生成完全指南:从基础到高级实战 date: 2025/3/10 updated: 2025/3/10 author: cmdragon excerpt: ...

  10. 记vue修改数组属性,dom不发生变化的问题

    目录: 目录 目录: 开篇 正确的姿势 为什么 $set 开篇 今天在写vue的时候,出现了一个以前可能没遇到的问题.我利用一个数组记录列表下按钮的启用.禁用状态,但我点击某个列表项按钮后,会修改当前 ...