Spring 及 Spring Boot 条件化注解(15个)完整列表及示例

news2025/4/1 6:56:48

Spring 及 Spring Boot 条件化注解完整列表及示例


1. 所有条件化注解列表

Spring 和 Spring Boot 提供了以下条件化注解(共 15 个),用于在配置类或方法上实现条件化注册 Bean 或配置:

注解名称作用来源框架
@Conditional自定义条件逻辑。Spring Core
@ConditionalOnClass类路径存在指定类时触发。Spring Core
@ConditionalOnMissingClass类路径不存在指定类时触发。Spring Core
@ConditionalOnBean指定 Bean 存在时触发。Spring Core
@ConditionalOnMissingBean指定 Bean 不存在时触发。Spring Core
@ConditionalOnExpressionSpEL 表达式为 true 时触发。Spring Core
@ConditionalOnJava当前 Java 版本满足条件时触发。Spring Core
@ConditionalOnProperty配置属性存在且符合指定值时触发。Spring Core
@ConditionalOnResource类路径存在指定资源文件时触发。Spring Boot
@ConditionalOnWebApplication当应用是 Web 应用时触发。Spring Boot
@ConditionalOnNotWebApplication当应用不是 Web 应用时触发。Spring Boot
@ConditionalOnSingleCandidate指定类型只有一个候选 Bean 或类型匹配时触发。Spring Boot
@ConditionalOnJndiJNDI 资源存在时触发。Spring Boot
@ConditionalOnMissingJndiJNDI 资源不存在时触发。Spring Boot
@ConditionalOnCloudPlatform当运行在指定云平台(如 AWS、Azure)时触发。Spring Cloud

2. 完整代码示例
(1) @Conditional(自定义条件)

作用:通过实现 Condition 接口自定义条件逻辑。

// 自定义条件类
public class CustomCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().containsProperty("custom.key");
    }
}

// 配置类
@Configuration
@Conditional(CustomCondition.class) // 自定义条件
public class CustomConditionConfig {
    @Bean
    public String customConditionBean() {
        return "Bean created by custom condition";
    }
}

// 测试类
@SpringBootTest(properties = "custom.key=true")
class CustomConditionTest {
    @Autowired(required = false)
    private String customConditionBean;

    @Test
    void testWithCustomKey() {
        assertNotNull(customConditionBean);
    }
}

(2) @ConditionalOnClass

作用:类路径存在指定类时触发。

@Configuration
@ConditionalOnClass(DataSource.class) // 当存在 DataSource 类时触发
public class ClassConditionConfig {
    @Bean
    public String dataSourceBean() {
        return "DataSource exists";
    }
}

(3) @ConditionalOnMissingClass

作用:类路径不存在指定类时触发。

@Configuration
@ConditionalOnMissingClass("org.springframework.jdbc.datasource.DataSource") // 当无 DataSource 类时触发
public class MissingClassConditionConfig {
    @Bean
    public String noDataSourceBean() {
        return "DataSource does NOT exist";
    }
}

(4) @ConditionalOnBean

作用:指定 Bean 存在时触发。

@Configuration
@ConditionalOnBean(name = "dataSource") // 当存在 dataSource Bean 时触发
public class BeanConditionConfig {
    @Bean
    public String dataSourceDependentBean() {
        return "Bean created because dataSource exists";
    }
}

(5) @ConditionalOnMissingBean

作用:指定 Bean 不存在时触发。

@Configuration
public class MissingBeanConditionConfig {
    @Bean
    @ConditionalOnMissingBean(name = "myBean") // 当无 myBean 时触发
    public String missingBean() {
        return "Bean created because 'myBean' is missing";
    }
}

(6) @ConditionalOnExpression

作用:SpEL 表达式为 true 时触发。

@Configuration
@ConditionalOnExpression("${app.env} == 'prod'") // 当 env 为 prod 时触发
public class ExpressionConditionConfig {
    @Bean
    public String prodBean() {
        return "Bean for prod environment";
    }
}

(7) @ConditionalOnJava

作用:Java 版本满足条件时触发。

@Configuration
@ConditionalOnJava(baseline = JavaVersion.EIGHT, fallback = JavaVersion.TEN) // Java 8-10 时触发
public class JavaVersionConditionConfig {
    @Bean
    public String java8To10Bean() {
        return "Java 8-10 compatible";
    }
}

(8) @ConditionalOnProperty

作用:配置属性存在且符合指定值时触发。

@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true") // 当 feature.enabled 为 true 时触发
public class PropertyConditionConfig {
    @Bean
    public String enabledFeatureBean() {
        return "Feature enabled";
    }
}

(9) @ConditionalOnResource

作用:类路径存在指定资源文件时触发(Spring Boot)。

@Configuration
@ConditionalOnResource(resources = "classpath:config/application-prod.properties") // 当资源存在时触发
public class ResourceConditionConfig {
    @Bean
    public String prodResourceBean() {
        return "Resource exists";
    }
}

(10) @ConditionalOnWebApplication

作用:应用是 Web 应用时触发(Spring Boot)。

@Configuration
@ConditionalOnWebApplication // Web 应用时触发
public class WebConditionConfig {
    @Bean
    public String webBean() {
        return "Web application";
    }
}

(11) @ConditionalOnNotWebApplication

作用:应用不是 Web 应用时触发(Spring Boot)。

@Configuration
@ConditionalOnNotWebApplication // 非 Web 应用时触发
public class NonWebConditionConfig {
    @Bean
    public String nonWebBean() {
        return "Non-web application";
    }
}

(12) @ConditionalOnSingleCandidate

作用:指定类型只有一个候选 Bean 时触发(Spring Boot)。

@Configuration
@ConditionalOnSingleCandidate(DataSource.class) // 当唯一 DataSource 存在时触发
public class SingleCandidateConditionConfig {
    @Bean
    public String singleDataSourceBean() {
        return "Single DataSource candidate";
    }
}

(13) @ConditionalOnJndi

作用:JNDI 资源存在时触发(Spring Boot)。

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/MyDB") // 当 JNDI 资源存在时触发
public class JndiConditionConfig {
    @Bean
    public String jndiBean() {
        return "JNDI resource exists";
    }
}

(14) @ConditionalOnMissingJndi

作用:JNDI 资源不存在时触发(Spring Boot)。

@Configuration
@ConditionalOnMissingJndi("java:comp/env/jdbc/MyDB") // 当 JNDI 资源不存在时触发
public class MissingJndiConditionConfig {
    @Bean
    public String noJndiBean() {
        return "JNDI resource does NOT exist";
    }
}

(15) @ConditionalOnCloudPlatform

作用:运行在指定云平台时触发(Spring Cloud)。

@Configuration
@ConditionalOnCloudPlatform(Azure.class) // 当运行在 Azure 时触发
public class CloudConditionConfig {
    @Bean
    public String azureBean() {
        return "Bean for Azure environment";
    }
}

3. 条件注解对比表
注解触发条件典型场景参数示例来源框架
@Conditional自定义 Condition 接口实现的逻辑。灵活的自定义条件。@Conditional(CustomCondition.class)Spring Core
@ConditionalOnClass类路径存在指定类。检测依赖是否存在。@ConditionalOnClass(DataSource.class)Spring Core
@ConditionalOnMissingClass类路径不存在指定类。检测依赖缺失。@ConditionalOnMissingClass("DataSource")Spring Core
@ConditionalOnBean指定 Bean 存在。依赖其他 Bean 的存在。@ConditionalOnBean(name = "dataSource")Spring Core
@ConditionalOnMissingBean指定 Bean 不存在。避免重复注册 Bean。@ConditionalOnMissingBean(name = "myBean")Spring Core
@ConditionalOnExpressionSpEL 表达式为 true复杂条件判断。@ConditionalOnExpression("${app.env} == 'prod'")Spring Core
@ConditionalOnJava当前 Java 版本满足条件。根据 Java 版本启用功能。@ConditionalOnJava(baseline = JavaVersion.EIGHT)Spring Core
@ConditionalOnProperty配置属性存在且符合指定值。根据配置启用功能。@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")Spring Core
@ConditionalOnResource类路径存在指定资源文件。根据资源文件存在与否配置。@ConditionalOnResource("classpath:config/prod.properties")Spring Boot
@ConditionalOnWebApplication应用是 Web 应用。Web 相关配置。@ConditionalOnWebApplicationSpring Boot
@ConditionalOnNotWebApplication应用不是 Web 应用。非 Web 应用配置。@ConditionalOnNotWebApplicationSpring Boot
@ConditionalOnSingleCandidate指定类型只有一个候选 Bean 或类型匹配。确保唯一 Bean。@ConditionalOnSingleCandidate(DataSource.class)Spring Boot
@ConditionalOnJndiJNDI 资源存在。根据 JNDI 资源触发配置。@ConditionalOnJndi("java:comp/env/jdbc/MyDB")Spring Boot
@ConditionalOnMissingJndiJNDI 资源不存在。根据 JNDI 缺失触发配置。@ConditionalOnMissingJndi("java:comp/env/jdbc/MyDB")Spring Boot
@ConditionalOnCloudPlatform运行在指定云平台(如 AWS、Azure)。云平台相关配置。@ConditionalOnCloudPlatform(Azure.class)Spring Cloud

4. 总结

Spring 及 Spring Boot 的条件化注解通过 条件判断 实现配置的动态加载,核心是 Condition 接口和其衍生注解。关键点如下:

  • 依赖检测@ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnJndi
  • Bean 状态@ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnSingleCandidate
  • 属性/环境@ConditionalOnProperty@ConditionalOnExpression@ConditionalOnJava
  • 应用类型@ConditionalOnWebApplication@ConditionalOnNotWebApplication
  • 云平台@ConditionalOnCloudPlatform(Spring Cloud)。
  • 自定义条件:通过 @Conditional 实现灵活扩展。

这些注解帮助开发者根据运行时环境、依赖、配置等条件动态注册 Bean,减少硬编码,提升代码的灵活性和可维护性。例如:

  • Spring Boot 的 @ConditionalOnResource 可用于根据配置文件是否存在来启用功能。
  • @ConditionalOnCloudPlatform 可在不同云平台(如 AWS、Azure)间切换配置。
  • @ConditionalOnJndi 适用于需要 JNDI 资源的环境(如企业级应用服务器)。

根据具体需求选择合适的注解,可显著简化配置逻辑并增强代码的适应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MantisBT在Windows10上安装部署详细步骤

MantisBT 是一款基于 Web 的开源缺陷跟踪系统,以下是在 Windows 10 上安装部署 MantisBT 的详细步骤: 1. 安装必要的环境 MantisBT 是一个基于 PHP 的 Web 应用程序,因此需要安装 Web 服务器(如 Apache)、PHP 和数据…

9.4分漏洞!Next.js Middleware鉴权绕过漏洞安全风险通告

今日,亚信安全CERT监控到安全社区研究人员发布安全通告,Next.js 存在一个授权绕过漏洞,编号为 CVE-2025-29927。攻击者可能通过发送精心构造的 x-middleware-subrequest 请求头绕过中间件安全控制,从而在未授权的情况下访问受保护…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数,主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

CTF类题目复现总结-[MRCTF2020]ezmisc 1

一、题目地址 https://buuoj.cn/challenges#[MRCTF2020]ezmisc二、复现步骤 1、下载附件,得到一张图片; 2、利用010 Editor打开图片,提示CRC值校验错误,flag.png应该是宽和高被修改了,导致flag被隐藏掉;…

linux打包前端vue,后端springboot项目

第一步先对整个项目进行通过maven进行clean在进行compile 第二步直接进行打包package和install都可以 第三部把对应的jar放到服务器上 把jar包放到服务器上某个地址下,然后cd到这个目录下,然后执行命令 nohup java -jar ruoyi-admin.jar > springbo…

Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理

作者:来自 Elastic Carly Richmond 你是否经常听到 AI 代理(AI agents)这个词,但不太确定它们是什么,或者如何在 TypeScript(或 JavaScript)中构建一个?跟我一起深入了解 AI 代理的概…

Docker 快速入门指南

Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台&#xff0c;可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…

自顶向下学习K8S--部署Agones

本文在本人博客&#xff0c;原文地址&#xff1a;http://viogami.tech/index.php/blog/346/ 我是gopher&#xff0c;离不开云原生&#xff0c;自然也逃不了理解docker和K8S这俩。今天抽空想玩下agones&#xff0c;进而对K8S有实践性的理解。 学一个新事物从底层理论学肯定是最…

unity中Xcharts图表鼠标悬浮表现异常

鼠标悬浮在面板附近&#xff0c;只显示单独的一个项目 而且无论鼠标如何移动&#xff0c;根本没有效果。 解决方案&#xff1a; 需要在对应的Canvas上绑定主相机才可以 鼠标移动到项目上就有信息展示了

【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean

参考笔记&#xff1a;java 包装类 万字详解&#xff08;通俗易懂)_java包装类-CSDN博客 目录 1.简介 2.包装类的继承关系图 3.装箱和拆箱 3.1 介绍 3.2 手动拆装箱 3.3. 自动拆装箱 ​4.关于String类型的转化问题 4.1 String类型和基本类型的相互转化 4.1.1 String —…

口腔种植全流程AI导航系统及辅助诊疗与耗材智能化编程分析

一、系统架构与编程框架设计 口腔种植全流程人工智能导航系统的开发是一项高度复杂的多学科融合工程,其核心架构需在医学精准性、工程实时性与临床实用性之间实现平衡。系统设计以模块化分层架构为基础,结合高实时性数据流与多模态协同控制理念,覆盖从数据采集、智能决策到…

Java 集合中ArrayList与LinkedList的性能比较

一、需求&#xff1a; 头部插入‌&#xff1a;向列表头部插入10万个整数。‌随机访问‌&#xff1a;从列表中间位置连续获取1万个元素。‌头部删除‌&#xff1a;从列表头部连续删除10万个元素。 二、 使用ArrayList与LinkedList测试 //常量定义&#xff0c;用于测试操作的次数…

漏洞发现:AWVS 联动 XRAY 图形化工具.(主动+被动 双重扫描)

漏洞发现&#xff1a;AWVS 联动 XRAY 图形化工具. 漏洞发现是网络安全领域的关键环节&#xff0c;指通过技术手段识别计算机系统、网络设备或软件中存在的设计缺陷、配置错误或代码漏洞的过程。这些漏洞可能被攻击者利用&#xff0c;导致数据泄露、服务中断或权限提升等风险。…

Linux ping/telnet/nc命令

在Linux操作系统中&#xff0c;ping命令用于测试网络连接和发送数据包到目的主机。 然而&#xff0c;ping命令默认情况下只能测试IP地址和域名&#xff0c;而无法直接测试端口号。 ping www.baidu.comping 192.168.0.1 测试端口 如果你想测试特定端口是否开放并响应&#xff…

Netty - 从Nginx 四层(TCP/UDP)流量中获取客户端真实/网络出口IP

文章目录 一、背景与原理1.1 问题场景网络架构影响分析1.1 客户端与Nginx之间存在的NAT/VPN1.2 Nginx与RPC服务之间的NAT 1.2 技术原理 二、环境配置验证2.1 Nginx配置2.2 版本要求 三、Netty服务端实现3.1 Pipeline配置&#xff08;核心代码&#xff09;3.2 协议处理器实现3.3…

Ubuntu下载docker、xshell

配置&#xff1a;VMware虚拟机、Ubuntu24.04.1 首先打开vm启动虚拟机 下载docker Ubuntu启动之后&#xff0c;按CTRLALTT 打开终端 1.更新软件包索引并安装依赖 sudo apt-get updatesudo apt-get install \ca-certificates \curl \gnupg \lsb-release 2.添加docker官方的GP…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…

office_word中使用宏以及DeepSeek

前言 Word中可以利用DeepSeek来生成各种宏&#xff0c;从而生成我们需要各种数据和图表&#xff0c;这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016&#xff0c;如下图&#xff1a; 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…

数据结构day04

一 栈 1栈的基本概念 各位同学大家好&#xff0c;从这个小节开始&#xff0c;我们会正式进入第三章的学习&#xff0c;我们会学习栈和队列&#xff0c;那这个小节中我们会先认识栈的基本概念。我们会从栈的定义和栈的基本操作来认识栈这种数据结构&#xff0c;也就是要探讨栈的…

质量工程:数字化转型时代的质量体系重构

前言&#xff1a;质量理念的范式转移阅读原文 如果把软件开发比作建造摩天大楼&#xff1a; 传统测试 竣工后检查裂缝&#xff08;高成本返工&#xff09; 质量工程 从地基开始的全流程监理体系&#xff08;设计图纸→施工工艺→建材选择→竣工验收&#xff09; IEEE研究…