重學SpringBoot3-@ConditionalOnXxx條件注解

在這里插入圖片描述

重學SpringBoot3-@ConditionalOnXxx條件注解

  • 引言
  • 常見的條件注解
  • 常見的條件注解示例
  • 擴展條件注解
    • 1. @ConditionalOnJndi
    • 2. @ConditionalOnJava
    • 3. @ConditionalOnCloudPlatform
    • 4. @ConditionalOnEnabledResourceChain
    • 5. 自定義條件注解
  • 總結

引言

Spring Boot 提供了一組強大的條件注解(形如 @ConditionalOnXxx),這些注解允許開發者根據特定的條件來控制配置類或者 bean 的創建。這種機制支持靈活的配置和自動配置,是 Spring Boot “約定優于配置”理念的體現。

常見的條件注解

以下是一些 Spring Boot 中常見的條件注解及其作用:

  • @ConditionalOnBean@ConditionalOnMissingBean:這兩個注解控制一個 bean 的創建是否依賴于容器中是否存在另一個 bean。例如,只有當容器中存在 DataSource 類型的 bean 時,某個數據訪問相關的 bean 才會被創建。

  • @ConditionalOnClass@ConditionalOnMissingClass:這些注解根據類路徑上是否存在某個類來控制配置類或 bean 的創建。這對于基于可用依賴自動配置組件非常有用。

  • @ConditionalOnProperty:這個注解允許基于 Spring Environment 的屬性值來控制 bean 的創建。例如,你可以根據某個特定的屬性是否存在或值為何來決定是否創建一個 bean。

  • @ConditionalOnResource:當一個特定的資源存在于類路徑上時,相關的配置或 beans 才會被創建。

  • @ConditionalOnWebApplication@ConditionalOnNotWebApplication:這兩個注解基于應用是否是一個 web 應用來控制配置或 beans 的創建。

  • @ConditionalOnExpression:基于 SpEL 表達式的評估結果來控制 bean 的創建。

常見的條件注解示例

下面是一些使用 Spring Boot 條件注解的示例:

@Configuration
@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
public class JdbcTemplateAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

在這個例子中,JdbcTemplateAutoConfiguration 配置類只有在 DataSourceJdbcTemplate 類都在類路徑上時才會被激活。同時,jdbcTemplate bean 只有在缺失時才會被創建。

@Configuration
@ConditionalOnWebApplication
public class WebConfig {@Beanpublic User myUser() {return new User();}
}

在這個例子中,WebConfig 配置類只有在應用是一個 web 應用時才會生效。

@Bean
@ConditionalOnProperty(name = "user.show", havingValue = "true")
public User myUser1() {return new User();
}

這里,myUser1 只有在 application.properties 文件中設置了 use.my.bean=true 時才會被創建。

@Bean
@ConditionalOnExpression("#{environment['spring.profiles.active'] == 'dev' && systemProperties['user.country'] == 'CN'}")
public User myUser2() {return new User();
}

這里,myUser2 只在當前激活的 Spring 配置文件為 dev 且系統屬性 user.country 設置為 CN 時創建。

擴展條件注解

還有一些不常用但可以幫助開發者根據不同的環境或條件靈活配置應用。下面是一些額外的條件注解及其用法:

1. @ConditionalOnJndi

@ConditionalOnJndi 注解可以控制配置或 beans 的創建,依賴于 JNDI (Java Naming and Directory Interface) 的存在。例如,只有當特定的 JNDI 資源可用時,某個 bean 才會被創建。

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/DataSource")
public class JndiDataConfig {// 配置類定義
}

這里,JndiDataConfig 配置類只有在名為 java:comp/env/jdbc/DataSourceJNDI 資源存在時才會生效。

2. @ConditionalOnJava

@ConditionalOnJava 控制配置或 bean 的創建,基于 Java 版本。這允許你編寫只在特定版本的 Java 環境下才激活的配置。

@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class Java8Config {// 配置類定義
}

在這個例子中,Java8Config 配置類只有在 Java 8 環境中才會生效。

3. @ConditionalOnCloudPlatform

@ConditionalOnCloudPlatform 是 Spring Boot 2.2 引入的注解,用于根據應用運行的云平臺環境來控制配置或 bean 的創建。例如,你可以基于應用是否在 AWS 或 Azure 上運行來進行不同的配置。

@Configuration
@ConditionalOnCloudPlatform(CloudPlatform.AWS)
public class AwsConfig {// 配置類定義
}

在這個例子中,AwsConfig 只在 AWS 環境下才會生效。

4. @ConditionalOnEnabledResourceChain

@ConditionalOnEnabledResourceChain 是 Spring Boot 中的一個條件注解,主要用于 Web 資源優化配置。它用于條件性地配置資源鏈(Resource Chain),以提高 Web 應用程序中靜態資源(如 JavaScript、CSS 文件)的服務效率。

@Configuration
@ConditionalOnEnabledResourceChain
public class CustomResourceChainConfig {// 在這里定義資源鏈相關的 bean 或配置
}

只有當 application.propertiesapplication.yml 中的配置項 spring.resources.chain.enabled 被設置為 true 時,CustomResourceChainConfig 中的配置才會被注冊和生效。

5. 自定義條件注解

除了使用 Spring Boot 提供的條件注解外,你還可以創建自己的條件注解。這通常涉及實現 Condition 接口,并使用 @Conditional 注解來應用它。這允許你定義非常具體和細粒度的條件邏輯。

public class OnSystemPropertyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {return "true".equals(System.getProperty("my.custom.property"));}
}@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Conditional(OnSystemPropertyCondition.class)
public @interface ConditionalOnSystemProperty {// 注解定義
}

使用這個自定義注解,你可以控制只有當系統屬性 my.custom.property 設置為 true 時,相關的配置或 beans 才會被創建。

總結

Spring Boot 的條件注解提供了一種強大且靈活的方式來根據不同的條件動態地配置 Spring 應用。通過使用這些注解,開發者可以輕松實現基于條件的自動配置,這使得應用配置更加簡潔和高效。掌握這些條件注解,將有助于你更好地理解和使用 Spring Boot 的自動配置功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716596.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716596.shtml

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

相關文章

ERDAS監督分類與溫度反演教程

本期帶來監督分類教程,更多內容,歡迎關注小編的公眾號梧桐涼月哦!!! 一、研究區自然、地理環境特征: 1、景德鎮市位于中國江西省東北部,地處贛江中游的贛北盆地,地形地貌以丘陵和低…

mitmproxy代理

文章目錄 mitmproxy1. 網絡代理2. 安裝3. Https請求3.1 啟動mitmproxy3.2 獲取證書3.3 配置代理3.4 運行測試 4. 請求4.1 讀取請求4.2 修改請求4.3 攔截請求 5. 響應5.1 讀取響應5.2 修改響應 6. 案例:共享賬號6.1 登錄bilibili獲取cookies6.2 在代理請求中設置cook…

ER-NeRF實時對話數字人模型訓練與部署

ER-NeRF是基于NeRF用于生成數字人的方法,可以達到實時生成的效果。 下載源碼 cd D:\Projects\ git clone https://github.com/Fictionarry/ER-NeRF cd D:\Projects\ER-NeRF 下載模型 準備面部解析模型 wget https://github.com/YudongGuo/AD-NeRF/blob/master/…

MyBatisPlus入門教程

MyBatisPlus MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window) 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。 官網地址:https://baomidou.com/ 一、入門案…

sql注入之sqli-labs-less-1 錯誤注入

輸入?id1 得到登錄頁面: 通過order by 函數試探: 5的時候報錯 試探到3 的時候返回正確的值: 然后繼續注入:?id -1 union select 1,2,3 -- 查看回顯點: 開始查看數據庫內容:id-1 union select 1,databa…

OpenXR 超詳細的spec--API初始化介紹

3.API 初始化 3.2 Function Pointers XrResult xrGetInstanceProcAddr(XrInstance instance,const char* name,PFN_xrVoidFunction* function); instance: XrInstance類型&#…

open-spider開源爬蟲工具:抖音數據采集

在當今信息爆炸的時代,網絡爬蟲作為一種自動化的數據收集工具,其重要性不言而喻。它能夠幫助我們從互聯網上高效地提取和處理數據,為數據分析、市場研究、內容監控等領域提供支持。抖音作為一個全球性的短視頻平臺,擁有海量的用戶…

CKA考生注意:這些Deployment要點能助你一臂之力!

往期精彩文章 : 提升CKA考試勝算:一文帶你全面了解RBAC權限控制!揭秘高效運維:如何用kubectl top命令實時監控K8s資源使用情況?CKA認證必備:掌握k8s網絡策略的關鍵要點提高CKA認證成功率,CKA真題中的節點維…

68-解構賦值,迭代器,生成器函數

1.解構賦值(針對數組array&#xff0c;字符串String及對象object以) 結構賦值是一種特殊的語法&#xff0c;通過將各種結構中的元素復制到變量中達到"解構"的目的&#xff0c;但是數組本身沒有改變 1.1解構單層數組 <script>let arr [1,2,3,4,5];//獲取數組…

c++ primer學習筆記(一)

目錄 第一章、c快速入門 重點&#xff1a;類的簡介 第二章 1、基本內置類型 2、字面值常量 1、整型字面值規則 2、浮點字面值規則 3、布爾字面值 4、字符字面值 5、非打印字符的轉義序列 ?編輯 6、字符串字面值 3、變量 1、變量標識符 2、定義和初始化對象 3、…

leetcode 1328.破壞回文串

題目鏈接LeetCode1328 1.題目 給你一個由小寫英文字母組成的回文字符串 palindrome &#xff0c;請你將其中 一個 字符用任意小寫英文字母替換&#xff0c;使得結果字符串的 字典序最小 &#xff0c;且 不是 回文串。 請你返回結果字符串。如果無法做到&#xff0c;則返回一個…

java: 無法訪問org.springframework.web.bind.annotation.RequestMapping......類文件具有錯誤的版本 61.0, 應為 52.0

文章目錄 一、報錯問題二、問題背景三、原因分析四、解決方案 一、報錯問題 java: 無法訪問org.springframework.web.bind.annotation.RequestMapping 錯誤的類文件: /D:/SoftwareInstall/Maven/repository/org/springframework/spring-web/6.0.9/spring-web-6.0.9.jar!/org/s…

latex報錯Repeated entry解決辦法

報錯原因——重復了兩個參考文獻&#xff0c;刪掉一個即可 總結 "Repeated entry"這個錯誤通常出現在你嘗試在LaTeX中多次使用同一個標簽&#xff08;label&#xff09;或者多次插入相同的圖像/表格等時。例如&#xff0c;在LaTeX中&#xff0c;我們可能會為每一個章…

Modern C++ std::any為何要求Tp可拷貝構造?

小問題也會影響設計的思路&#xff0c;某個問題或某種case的探討有助于理解設計的初衷。 聲明&#xff1a;以下_Tp/Tp都是指要放入std::any的對象的類型。 它要求_Tp is_copy_constructible, 僅僅是因為有很多函數的實現調用了Tp的拷貝構造函數嗎&#xff1f;比如說上節提到的初…

動態SQL的處理

學習視頻&#xff1a;3001 動態SQL中的元素_嗶哩嗶哩_bilibili 目錄 1.1為什么學 1.2動態SQL中的元素 條件查詢操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用場景 復雜查詢操作 foreach 元素中的屬性 ?編輯 迭代數組 迭代List 迭代Map 1…

代碼隨想錄算法訓練營第二十七天|LeetCode93 復原IP地址、LeetCode78 子集、LeetCode90 子集II

93.復原IP地址 思路&#xff1a;要建立一個判斷子字符串是否合法的函數&#xff0c;判斷多種不合法的情況。在回溯函數中&#xff0c;參數除了s,和startindex還需要一個pointNum來記錄句點的數量&#xff0c;當句點的數量等于3時&#xff0c;判斷最后一個子串是否合法&#xf…

第3部分 原理篇2去中心化數字身份標識符(DID)(4)

3.2.3. DID解析 3.2.3.1. DID解析參與方 圖3-5 DID 解析過程 本聰老師&#xff1a;我們之前提到過&#xff0c;DID 解析過程是將 DID 轉換為對應的 DID 文檔。這樣做的目的是驗證 DID 所代表的主體的身份。那么解析過程會涉及哪些概念呢&#xff1f;我們看圖3-&#xff0c;DI…

端智能:面向手機計算環境的端云協同AI技術創新

近年來&#xff0c;隨著移動端設備軟硬件能力的進步&#xff0c;移動端的算力有了很大提升&#xff0c;同時面向移動端的機器學習框架和模型輕量化技術越來越成熟&#xff0c;端上的AI能力逐漸進入大眾視野&#xff0c;端智能在電商領域也開始逐步走向規模化應用。通過持續探索…

leetcode日記(35)跳躍游戲Ⅱ

想了一個晚上&#xff0c;第一個思路是用動態規劃&#xff0c;記錄走到每一個節點需要跳動的最小步數&#xff0c;大致方法是每走到一個節點就遍歷一下前面的全部節點&#xff0c;看看哪個節點可以一部跳到該節點&#xff0c;然后從中選取跳躍步數最小的節點&#xff0c;最后輸…

完美解決多個Echarts圖表自適應窗口、父容器寬高,并進行性能優化

場景 很多時候我們會在繪制echarts圖表時&#xff0c;使用以下方法監聽瀏覽器尺寸變化&#xff0c;讓圖表resize()完成自適應 window.addEventListener(resize, ()>{wordCloudChart.resize() })然后&#xff0c;這種自適應真的足夠周全嘛&#xff1f;有些時候&#xff0c;…