Spring Boot 注解 @ConditionalOnMissingBean是什么

一句話總結:

@ConditionalOnMissingBean 是 Spring Boot 提供的一個 條件注解(Conditional Annotation),意思是:

只有當 Spring 容器中 不存在 某個 Bean 時,當前的 Bean 或配置才會被加載。

這是一種典型的“按需裝配”策略,常用于自動配置類(Auto Configuration)中。

如果大家有看源碼的習慣,會發現到處都有這個注解:

RestTemplate:

Jackson - ObjectMapper:

  • Spring Boot 默認提供的 JSON 解析工具?ObjectMapper

  • 如果你沒自己定義一個,它就幫你創建一個默認的

  • 你可以完全覆蓋它,比如配置命名策略、日期格式等

框架或者組件庫想要提供一個默認實現,但又允許使用者自定義自己的實現。這個時候就可以使用?@ConditionalOnMissingBean。這就達到了 可擴展+默認兜底 的目的。

同理,還有個相對應的是:@ConditionalOnBean?

對比:@ConditionalOnBean?vs?@ConditionalOnMissingBean

注解含義
@ConditionalOnBean(SomeClass.class)只有當容器中存在 SomeClass 類型的 Bean 時才執行
@ConditionalOnMissingBean(SomeClass.class)只有當容器中不存在 SomeClass 類型的 Bean 時才執行

這兩個注解是互補的,分別用于不同的場景。

支持的用法形式

@ConditionalOnMissingBean(SomeClass.class)                 // 類型判斷
@ConditionalOnMissingBean(name = "someBeanName")           // 名稱判斷
@ConditionalOnMissingBean(value = SomeClass.class)         // 等價于上面的類型判斷
@ConditionalOnMissingBean(type = "com.example.SomeClass")  // 用字符串形式避免類加載

你也可以組合使用,如:

@ConditionalOnMissingBean(value = SomeInterface.class,name = "customBean"
)

特別注意:

不能直接加在?@Component、@Service、@Controller?等用于直接注冊?Bean?的注解上,因為?Spring?在解析這些注解時并不會走自動配置的判斷邏輯,因此不會觸發?@ConditionalOnMissingBean?的條件判斷,最終會導致Bean?被強制注冊或?注冊失敗報錯!

代碼示例

自定義一個接口:


public interface MyService {void hello();
}

錯誤示例

先來一個錯誤示例(直接在@Component下加上了):


@Slf4j
@Component
@ConditionalOnMissingBean(MyService.class)
public class MyServiceDefault implements MyService {@Overridepublic void hello() {log.info("use default bean...");}
}

?項目不會報錯,直接啟動后查找Bean:

會發現根本沒注冊上。所以,雖然加在@Component等注解的類上語法允許,但 Spring 不會進行條件判斷和直接注冊,可能導致意料之外的報錯。所以不要這么用。

正確用法:

@Configuration?+?@Bean?的方式(大家回頭看看我最上面截的源碼截圖中,也都是這種方式)


@Configuration
public class MyServiceAutoConfiguration {@Bean@ConditionalOnMissingBean(MyService.class)public MyService myService() {return new MyServiceDefault();}
}

默認實現類:


@Slf4j
public class MyServiceDefault implements MyService {@Overridepublic void hello() {log.info("use default bean...");}
}

找個地方調用一下:

public class StarApplication {@Autowiredprivate MyService myService;public static void main(String[] args) {SpringApplication.run(StarApplication.class, args);}@PostConstructpublic void test() {myService.hello();}
}

現在模擬用戶實現了這個接口:


@Slf4j
@Component
public class MyServiceUser implements MyService {@Overridepublic void hello() {log.info("use self bean...");}
}

可以看到就一個Bean:

當然,你也可以去掉這個注解試試:

再次運行:

可以看到兩個地方都注冊上了。

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

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

相關文章

PyInstaller 如何在mac電腦上生成在window上可執行的exe文件

PyInstaller跨平臺打包限制 PyInstaller 無法直接從macOS生成Windows可執行文件,因為它需要訪問目標平臺的系統庫和Python環境來構建可執行文件。要在macOS上為Windows打包Python應用,需要通過以下方法之一: 方法一:使用虛擬機或…

零基礎設計模式——創建型模式 - 抽象工廠模式

第二部分:創建型模式 - 抽象工廠模式 (Abstract Factory Pattern) 我們已經學習了單例模式(保證唯一實例)和工廠方法模式(延遲創建到子類)。現在,我們來探討創建型模式中更為復雜和強大的一個——抽象工廠…

【通用智能體】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解:搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…

Flask-SQLAlchemy核心概念:模型類與數據庫表、類屬性與表字段、外鍵與關系映射

前置閱讀,關于Flask-SQLAlchemy支持哪些數據庫及基本配置,鏈接:Flask-SQLAlchemy_數據庫配置 摘要 本文以一段典型的 SQLAlchemy 代碼示例為引入,闡述以下核心概念: 模型類(Model Class) ? 數…

野火魯班貓(arrch64架構debian)從零實現用MobileFaceNet算法進行實時人臉識別(四)安裝RKNN Toolkit2

RKNN Toolkit2是用來將onnx模型轉成rknn專用模型,并可通過RKNN Toolkit Lite2或者RKNPU調用NPU進行加速計算的工具。 一開始我安裝很多次都無法成功安裝。后來跟售后技術對接,必須是PC平臺的Linux環境才可以。我的電腦是windows,所以我需要用…

基于深度學習的工件檢測系統設計與實現

在工業自動化領域,工件檢測一直是提高生產效率和產品質量的關鍵環節。傳統的人工檢測方法不僅效率低下,而且容易受到主觀因素的影響,導致誤判率較高。隨著深度學習技術的飛速發展,基于圖像識別的自動檢測系統逐漸成為研究熱點。今…

CyberSecAsia專訪CertiK首席安全官:區塊鏈行業亟需“安全優先”開發范式

近日,權威網絡安全媒體CyberSecAsia發布了對CertiK首席安全官Wang Tielei博士的專訪,雙方圍繞企業在進軍區塊鏈領域時所面臨的關鍵安全風險與防御策略展開深入探討。 Wang博士在采訪中指出,跨鏈橋攻擊、智能合約漏洞以及私鑰管理不當&#x…

Google C++ Style Guide 谷歌 C++編碼風格指南,深入理解華為與谷歌的編程規范——C和C++實踐指南

Google C 編程風格指南 Release Apr 07, 2017 0. ?享 ?? 4.45 ??? Benjy Weinberger, Craig Silverstein, Gregory Eitzmann, Mark Mentovai, Tashana Landray ?? YuleFox, Yang.Y, acgtyrant, lilinsanity 亯??享 ? Google Style Guide ? Google 開源…

當科技邂逅浪漫:在Codigger的世界里,遇見“愛”

520,一個充滿愛意的日子,人們用各種方式表達對彼此的深情。而在科技的世界里,我們也正經歷著一場特別的邂逅——Codigger,一個分布式操作系統的誕生,正在以它獨特的方式,重新定義我們與技術的關系。 Codigg…

嵌入式學習筆記 - Void類型的指針

void指針的基本概念和特性 void指針是一種特殊的指針類型,稱為“無類型指針”或“通用指針”。它的主要特點是: ?通用性?:void指針可以指向任何類型的數據,這使得它在處理不確定數據類型時非常有用。 ?靈活性?:由…

【綜述】視頻目標分割VOS

相關連接 更新中....... 1、Associating Objects with Transformers for Video Object Segmentation:論文詳解、AOT源碼解析 2、Rethinking Space-Time Networks with Improved Memory Coverage for Efficient Video Object Segmentation 3、Recurrent Dynamic Embe…

001 嵌入式軟件開發工程師實習篇面試——首戰總結

2025年5月17日人生中第一次面試 緊張是藏不住的。但是不應該的。 目錄 0.準備一份合適的自我介紹 1.結構體內存對齊問題 2.變量在內存中的存儲模式 3.嵌入式中程序框架有哪些 4.程序代碼設計要遵循什原則 5.版本號書寫 6.單片機最小系統板有哪些組成 必須: 非必須:…

SIL2/PLd 認證 Inxpect毫米波安全雷達:3D 掃描 + 微小運動檢測守護工業安全

Inxpect 成立于意大利,專注工業安全技術。自成立起,便致力于借助先進雷達技術提升工業自動化安全標準,解決傳統安全設備在復雜環境中的局限,推出獲 SIL2/PLd 和 UL 認證的安全雷達產品。 Inxpect 的雷達傳感器技術優勢明顯。相較于…

Python數據可視化再探——Matplotlib模塊 之一

目錄 第一章 Matplotlib 模塊教學內容?——基礎圖形繪制 一、Pyplot 子庫介紹? 1. 功能概述? 2. 常用函數? 二、繪制基本圖形? 1. 柱狀圖? 2. 條形圖? 3. 折線圖? 4. 散點圖? 5. 面積圖? 6. 餅狀圖? 7. 圓環圖? ?編輯 三、繪圖知識點詳解? 1. 繪圖…

智慧在線判題OJ系統項目總體,包含功能開發思路,內部中間件,已經部分知識點

目錄 回顧一下xml文件怎么寫 哪個地方使用了哪個技術 MyBatis-Plus-oj的表結構設計, 管理員登錄功能 Swagger Apifox?編輯 BCrypt 日志框架引入(slf4jlogback) nacos Swagger無法被所有微服務獲取到修改的原因 身份認證三種方式: JWT(Json Web Json,一…

使用Spring Boot和Spring Security構建安全的RESTful API

使用Spring Boot和Spring Security構建安全的RESTful API 引言 在現代Web應用開發中,安全性是至關重要的。Spring Boot和Spring Security是Java生態中廣泛使用的框架,它們提供了強大的工具來保護RESTful API。本文將介紹如何結合Spring Boot和Spring S…

虛幻引擎5-Unreal Engine筆記之`GameMode`、`關卡(Level)` 和 `關卡藍圖(Level Blueprint)`的關系

虛幻引擎5-Unreal Engine筆記之GameMode、關卡(Level) 和 關卡藍圖(Level Blueprint)的關系 code review! 參考筆記: 1.虛幻引擎5-Unreal Engine筆記之GameMode、關卡(Level) 和 關卡藍圖&…

Java+Selenium+快代理實現高效爬蟲

目錄 一、前言二、Selenium簡介三、環境準備四、代碼實現4.1 創建WebDriver工廠類4.2 創建爬蟲主類4.3 配置代理的注意事項 六、總結與展望 一、前言 在Web爬蟲技術中,Selenium作為一款強大的瀏覽器自動化工具,能夠模擬真實用戶操作,有效應對…

SpringBoot配置文件的合并

需求:想分類將mysql數據庫的配置放在一個文件,redis的配置放在另外一個文件 就不去引入mysql和redis了,看能否得到值就行了 測試結果 model的包放錯了 應該移動到demo里 能否用yml或者yaml呢 這里注意yml的寫法 測試結果也是可以的 注意如果主配置文件是yml或者yaml的話

深入理解 BFC:網頁布局的關鍵機制

在前端開發的世界里,網頁布局是一項至關重要的任務。而在眾多布局相關的概念中,BFC(Block Formatting Context,塊級格式化上下文)扮演著極為關鍵的角色。今天,就讓我們深入剖析 BFC 的方方面面。 一、BFC …