简介

@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. MongoDB:分页查询(统计查询和分页列表查询)、排序查询、正则的复杂条件查询、比较查询、包含查询、条件连接查询

  2. nginx basic验证

    打开个生成htpasswd的网站 输入信息生成结果 将结果保存到nginx一个文件里面 修改nginx的conf文件 auth_basic "webA"; #这个"&qu ...

  3. RocketMQ原理—2.源码设计简单分析上

    大纲 1.NameServer的启动脚本 2.NameServer启动时会解析哪些配置 3.NameServer如何初始化Netty网络服务器 4.NameServer如何启动Netty网络服务器 5 ...

  4. Node.js 中 mysql 事务的写法

    最近做一个公司内部的信息化平台,本着短平快,选择了 Nodejs + Express + Vue + mysql/mongodb 的技术路线. 该写法主要利用了递归,下面把事务的写法记录一下,做了简单 ...

  5. 重试机制与 CompletableFuture 拓展

    重试机制与 CompletableFuture 拓展 禁止转载. 本文旨在讨论重试机制的特点和策略,分析常用重试类库的实现,讨论为 CompletableFuture 添加重试机制的方法.文章首发同名 ...

  6. 调研报告-基于 Iceberg 构建湖仓一体平台调研

    一.背景 我们使用 Iceberg 构建湖仓一体平台的初衷是希望解决业务方在使用 Hive 数仓时的一些痛点.主要包括以下几大方面: (1)现有的数据同步只支持全量同步,同步大表速度慢. (2)Hiv ...

  7. DeepSeek-R1本地部署如何选择适合你的版本?看这里

    DeepSeek-R1本地部署:选择最适合你的版本,轻松搞定! 关于本地部署DeepSeek-R1前期知识 如果你正在考虑将DeepSeek-R1部署到本地服务器上,了解每种类型的硬件需求是非常重要的 ...

  8. STM32的SYSTICK 定时器(系统滴答定时器)

    什么是SysTick? 这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一 ...

  9. Windows 提权-RunAs

    本文通过 Google 翻译 RunAs – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 ...

  10. Windows编程----进程:命令行参数

    什么是进程的命令行参数 每个进程在启动(双击exe启动.cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它.命令行的参数以空格区分.这个命令行总是不为空 ...