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


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 {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return context.getEnvironment().containsProperty("custom.key");}
}// 配置類
@Configuration
@Conditional(CustomCondition.class) // 自定義條件
public class CustomConditionConfig {@Beanpublic String customConditionBean() {return "Bean created by custom condition";}
}// 測試類
@SpringBootTest(properties = "custom.key=true")
class CustomConditionTest {@Autowired(required = false)private String customConditionBean;@Testvoid testWithCustomKey() {assertNotNull(customConditionBean);}
}

(2) @ConditionalOnClass

作用:類路徑存在指定類時觸發。

@Configuration
@ConditionalOnClass(DataSource.class) // 當存在 DataSource 類時觸發
public class ClassConditionConfig {@Beanpublic String dataSourceBean() {return "DataSource exists";}
}

(3) @ConditionalOnMissingClass

作用:類路徑不存在指定類時觸發。

@Configuration
@ConditionalOnMissingClass("org.springframework.jdbc.datasource.DataSource") // 當無 DataSource 類時觸發
public class MissingClassConditionConfig {@Beanpublic String noDataSourceBean() {return "DataSource does NOT exist";}
}

(4) @ConditionalOnBean

作用:指定 Bean 存在時觸發。

@Configuration
@ConditionalOnBean(name = "dataSource") // 當存在 dataSource Bean 時觸發
public class BeanConditionConfig {@Beanpublic 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 {@Beanpublic String prodBean() {return "Bean for prod environment";}
}

(7) @ConditionalOnJava

作用:Java 版本滿足條件時觸發。

@Configuration
@ConditionalOnJava(baseline = JavaVersion.EIGHT, fallback = JavaVersion.TEN) // Java 8-10 時觸發
public class JavaVersionConditionConfig {@Beanpublic String java8To10Bean() {return "Java 8-10 compatible";}
}

(8) @ConditionalOnProperty

作用:配置屬性存在且符合指定值時觸發。

@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true") // 當 feature.enabled 為 true 時觸發
public class PropertyConditionConfig {@Beanpublic String enabledFeatureBean() {return "Feature enabled";}
}

(9) @ConditionalOnResource

作用:類路徑存在指定資源文件時觸發(Spring Boot)。

@Configuration
@ConditionalOnResource(resources = "classpath:config/application-prod.properties") // 當資源存在時觸發
public class ResourceConditionConfig {@Beanpublic String prodResourceBean() {return "Resource exists";}
}

(10) @ConditionalOnWebApplication

作用:應用是 Web 應用時觸發(Spring Boot)。

@Configuration
@ConditionalOnWebApplication // Web 應用時觸發
public class WebConditionConfig {@Beanpublic String webBean() {return "Web application";}
}

(11) @ConditionalOnNotWebApplication

作用:應用不是 Web 應用時觸發(Spring Boot)。

@Configuration
@ConditionalOnNotWebApplication // 非 Web 應用時觸發
public class NonWebConditionConfig {@Beanpublic String nonWebBean() {return "Non-web application";}
}

(12) @ConditionalOnSingleCandidate

作用:指定類型只有一個候選 Bean 時觸發(Spring Boot)。

@Configuration
@ConditionalOnSingleCandidate(DataSource.class) // 當唯一 DataSource 存在時觸發
public class SingleCandidateConditionConfig {@Beanpublic String singleDataSourceBean() {return "Single DataSource candidate";}
}

(13) @ConditionalOnJndi

作用:JNDI 資源存在時觸發(Spring Boot)。

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/MyDB") // 當 JNDI 資源存在時觸發
public class JndiConditionConfig {@Beanpublic String jndiBean() {return "JNDI resource exists";}
}

(14) @ConditionalOnMissingJndi

作用:JNDI 資源不存在時觸發(Spring Boot)。

@Configuration
@ConditionalOnMissingJndi("java:comp/env/jdbc/MyDB") // 當 JNDI 資源不存在時觸發
public class MissingJndiConditionConfig {@Beanpublic String noJndiBean() {return "JNDI resource does NOT exist";}
}

(15) @ConditionalOnCloudPlatform

作用:運行在指定云平臺時觸發(Spring Cloud)。

@Configuration
@ConditionalOnCloudPlatform(Azure.class) // 當運行在 Azure 時觸發
public class CloudConditionConfig {@Beanpublic 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.pswp.cn/pingmian/74131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74131.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/74131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Kafka】深入探討 Kafka 如何保證一致性

文章目錄 Kafka 基本概念回顧?副本角色? 數據寫入一致性?同步副本(ISR)集合?數據讀取一致性?故障處理與一致性恢復?總結? 在分布式系統領域,數據一致性是至關重要的一環。作為一款高性能的分布式消息隊列系統,Kafka 在設計…

從入門到精通:SQL注入防御與攻防實戰——紅隊如何突破,藍隊如何應對!

引言:為什么SQL注入攻擊依然如此強大? SQL注入(SQL Injection)是最古老且最常見的Web應用漏洞之一。盡管很多公司和組織都已經采取了WAF、防火墻、數據庫隔離等防護措施,但SQL注入依然在許多情況下能夠突破防線&#…

【算法day27】有效的數獨——請你判斷一個 9 x 9 的數獨是否有效。只需要 根據以下規則 ,驗證已經填入的數字是否有效即可。

36. 有效的數獨 請你判斷一個 9 x 9 的數獨是否有效。只需要 根據以下規則 ,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。(請參考示例…

leetcode 2360. 圖中的最長環 困難

給你一個 n 個節點的 有向圖 ,節點編號為 0 到 n - 1 ,其中每個節點 至多 有一條出邊。 圖用一個大小為 n 下標從 0 開始的數組 edges 表示,節點 i 到節點 edges[i] 之間有一條有向邊。如果節點 i 沒有出邊,那么 edges[i] -1 。…

PySpur: AI 智能體可視化開發平臺

GitHub:https://github.com/PySpur-Dev/pyspur 更多AI開源軟件:發現分享好用的AI工具、AI開源軟件、AI模型、AI變現 - 小眾AI PySpur是一個開源的輕量級可視化AI智能體工作流構建器,旨在簡化AI系統的開發流程。通過拖拽式界面,用戶…

vcpkg安裝及使用教程,以安裝matio庫解析mat文件為例

vcpkg安裝及使用教程,以安裝matio庫解析mat文件為例 1. vcpkg安裝2 安裝matio三方庫3 將三方庫集成到VS中3.1 全局集成3.2 集成到特定工程4 結語Vcpkg 是微軟開發的一款開源的 C/C++ 包管理工具,旨在簡化 C/C++ 項目依賴庫的安裝和管理。它支持跨平臺(Windows、Linux、macO…

LLM架構解析:NLP基礎(第一部分)—— 模型、核心技術與發展歷程全解析

本專欄深入探究從循環神經網絡(RNN)到Transformer等自然語言處理(NLP)模型的架構,以及基于這些模型構建的應用程序。 本系列文章內容: NLP自然語言處理基礎(本文)詞嵌入&#xff0…

【Rtklib入門指南】2. 使用RTKLIB GUI進行觀測數據分析

數據準備 下載2025年1月1日的香港CORS站數據和觀測星歷,詳情參照如下博客: 使用GAMP_GOOD進行hk數據下載教程-CSDN博客 分析工具 RTKLIB 2.4.3 demo5(也可以選用RTKLIB2.4.2,但不建議使用RTKLIB2.4.3) 分析流程 …

suse15 sp1使用華為云軟件源yum源zypper源

登錄suse15終端, cd /etc/zypp/repos.d/進入目錄后執行以下命令: zypper ar -fcg https://mirrors.huaweicloud.com/opensuse/distribution/leap/15.1/repo/oss HuaWeiCloud:15.1:OSS zypper ar -fcg https://mirrors.huaweicloud.com/opensuse/distribu…

首屏加載時間優化解決

🤖 作者簡介:水煮白菜王(juejin/csdn同名) ,一位前端勸退師 👻 👀 文章專欄: 高德AMap專欄 ,記錄一下平時學習在博客寫作中記錄,總結出的一些開發技巧?。 感…

Sentinel[超詳細講解]-1

定義一系列 規則 &#x1f47a;&#xff0c;對資源進行 保護 &#x1f47a;&#xff0c; 如果違反的了規則&#xff0c;則拋出異常&#xff0c;看是否有fallback兜底處理&#xff0c;如果沒有則直接返回異常信息&#x1f60e; 1. 快速入門 1.1 引入 Sentinel 依賴 <depend…

02-Docker 使用

docker:快速構建、運行、管理應用的工具,可以幫助我們下載應用鏡像,創建并運行鏡像的容器,從而快速部署應用 1、部署mysql 先停掉虛擬機中的MySQL,確保你的虛擬機已經安裝Docker,且網絡開通的情況下,執行下面命令即可安裝MySQL(注意:若服務器上已經有mysql 占用了330…

@DeclareParents 注解實現接口功能增強:Spring中通過接口引入實現功能增強的完整示例

以下是Spring中通過接口引入實現功能增強的完整示例&#xff1a; // 1. 目標接口及實現類 package com.example;public interface Service {void doSomething(); }Component class ServiceImp implements Service {Overridepublic void doSomething() {System.out.println(&qu…

HTML中數字和字母不換行顯示

HTML中數字和字母不換行顯示的默認行為及如何通過CSS的word-wrap和word-break屬性進行調整。 在HTML中標簽中的數字和字母默認是不換行的&#xff0c;如果要將他們換行&#xff0c;在CSS中添加”word-wrap: break-word;” 即可解決 語法&#xff1a;word-wrap: normal|break-w…

Git團隊開發命令總結

簡易Git工作流 myname: 團隊成員個人分支dev: 團隊公共分支 個人獨立分支開發 同步最新的【dev公共分支】到本地。【重要】基于最新的【dev公共分支】&#xff0c;創建【個人功能開發分支】。在此基礎上開發。【個人功能開發分支】開發完成&#xff0c;推送到遠程庫。如果【…

Python人工智能大模型入門教程:從零構建高性能預測模型

引言&#xff1a;AI大模型時代的技術革命 在AlphaGo戰勝人類棋手的里程碑事件后&#xff0c;人工智能技術進入爆發式發展階段。本教程將帶您從零開始&#xff0c;使用Python構建一個工業級神經網絡模型。通過本教程&#xff0c;您不僅能掌握GPU加速訓練、混合精度計算等前沿技…

python-leetcode 61.N皇后

題目&#xff1a; 按照國際象棋的規則&#xff0c;皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊 給你一個整數 n &#xff0c;返回所有不同的 n 皇后問題 的解…

Mybatis_Plus中的常用注解

目錄 1、TableName TableId TableId的type屬性 TableField 1、TableName 經過以上的測試&#xff0c;在使用MyBatis-Plus實現基本的CRUD時&#xff0c;我們并沒有指定要操作的表&#xff0c;只是在 Mapper接口繼承BaseMapper時&#xff0c;設置了泛型User&#xff0c;而操…

JavaScript函數知識點總結

JavaScript函數是一種可重復使用的代碼塊,它接受輸入值(參數)、執行特定任務,并返回輸出值。 1. 聲明函數 function greet(name) {return "Hello, " + name + "!"; }console.log(greet("Alice")); // 輸出: Hello, Alice! console.log( t…

分布式計算Ray框架面試題及參考答案

目錄 簡述 Ray 的架構設計核心組件及其協作流程 全局控制存儲(GCS)在 Ray 中的作用是什么?如何實現高可用性? 對比 Ray 的任務(Task)與 Actor 模型,說明各自適用場景 解釋 Ray 的 Object Store 如何實現跨節點數據共享與零拷貝傳輸 Ray 的分布式調度器如何實現毫秒級…