Spring IOC 容器 **默認注冊 Bean** 的 8 條規則

Spring IOC 容器 默認注冊 Bean 的 8 條規則

(Spring Framework 6.x 源碼級總結)

閱讀提示:把下面 8 條規則背下來,再讀 Spring 源碼時,你會在任何一行代碼里立刻知道「這個 BeanDefinition 是從哪兒來的」。


1?? 環境掃描:從 啟動類所在包 向下遞歸

  • @SpringBootApplication 內隱含 @ComponentScan 無參數 → 掃描當前包及其子包。
  • 源碼位置:ComponentScanAnnotationParser#parse()ClassPathBeanDefinitionScanner#doScan()

2?? 類級別注解 自動注冊

遇到下列注解即注冊為 singleton Bean:

  • @Component(含 @Service@Repository@Controller 等元注解)
  • @Configuration(特殊:還會生成 CGLIB 代理,見規則 4)
  • @Bean 方法所在類如果被 @Configuration 標注,則方法返回值也被注冊。

3?? @Bean 方法 注冊規則

  • 作用域:默認 singleton;可通過 @Scope 覆蓋。
  • 名字
    • 顯式 value/name → 直接使用
    • 空 → 方法名首字母小寫
  • 重載保護:同名 Bean 后注冊的覆蓋先注冊的(DefaultListableBeanFactory#registerBeanDefinition 拋異常 → 允許覆蓋開關 spring.main.allow-bean-definition-overriding=true)。

4?? @Configuration 特殊邏輯

  • 類本身注冊為 lite @Component
  • 同時注冊 ConfigurationClassPostProcessor,它會:
    1. 解析 @Bean 方法
    2. 解析 @Import(普通類、ImportSelector、ImportBeanDefinitionRegistrar)
    3. 解析 @ComponentScan
    4. 生成 CGLIB 代理 保證 @Bean 方法內部依賴仍是單例。

5?? @Import 的三類導入

類型注冊方式示例
普通類直接注冊 singleton@Import(MyConfig.class)
ImportSelectorselectImports() 返回 String[]@EnableCaching
ImportBeanDefinitionRegistrar手動 registry.registerBeanDefinition()@EnableAspectJAutoProxy

6?? SPI 機制spring.factories & META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

  • Spring Boot 啟動時讀取 spring.factoriesEnableAutoConfiguration 列表
  • 每個自動配置類內部再用 @Configuration + @Bean 注冊大量基礎設施(DataSource、WebMvc、Security…)。

7?? FactoryBean & BeanFactoryPostProcessor

  • FactoryBean#getObject() 的返回值被注冊,名字為 &beanName(取實際對象去掉 &)。
  • BeanFactoryPostProcessor(如 PropertySourcesPlaceholderConfigurer)可在注冊階段 修改新增 BeanDefinition。

8?? 默認單例作用域 & 延遲初始化

  • 默認作用域:singleton
  • 默認非延遲:容器啟動即實例化;加 @Lazy 則延遲到首次調用 getBean()
  • 單例池:DefaultSingletonBeanRegistry#singletonObjects(ConcurrentHashMap)。

一張圖總結

啟動類包掃描 → 類注解(@Component/@Configuration) → @Bean方法↓@Import(三類) → @ComponentScan → spring.factories↓ConfigurationClassPostProcessor → 注冊所有BeanDefinition↓DefaultListableBeanFactory#preInstantiateSingletons → 實例化

背完這 8 條,再讀 Spring 源碼時,你會在任意一行 registerBeanDefinition() 前立刻定位“這是哪條規則觸發”。

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

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

相關文章

29.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--用戶配置服務

用戶配置服務是孢子記賬中最簡單的部分。簡單說,用戶配置服務就是用戶自定義的配置項存儲服務,用于我們的APP根據用戶的配置實現指定的功能。它提供了一個簡單的接口,允許用戶存儲和檢索他們的配置數據。就目前來說,用戶配置只有一…

Python實現PDF按頁分割:靈活拆分文檔的技術指南

Python實現PDF按頁分割:靈活拆分文檔的技術指南 PDF文件處理是日常工作中的常見需求,特別是當我們需要將大型PDF文檔拆分為多個部分時。本文將介紹如何使用Python創建一個靈活的PDF分割工具,能夠根據用戶指定的頁數范圍任意分割文檔。 需求分…

「iOS」——GCD其他方法詳解

GCD學習GCD其他方法dispatch_semaphore (信號量)**什么是信號量**dispatch_semaphore主要作用dispatch_semaphore主要作用異步轉同步設置一個最大開辟的線程數加鎖機制dispatch_time_t 兩種形式GCD一次性代碼(只執行一次)dispatch_barrier_async/sync柵欄…

【圖像處理基石】如何實現一個車輛檢測算法?

基于AI的車牌檢測和識別算法 問題描述、應用場景與難點 問題描述 車牌檢測和識別是計算機視覺領域的一個特定任務,主要包含兩個核心步驟: 車牌檢測:從圖像中準確定位車牌的位置和區域車牌識別:對檢測到的車牌區域進行字符識別&…

計算機學報 2025年 區塊鏈論文 錄用匯總 附pdf下載

計算機學報 Year:2025 2024請看 1 Title: 基于區塊鏈的動態多云多副本數據完整性審計方法研究 Authors: Key words: 區塊鏈;云存儲;多云多副本存儲;數據完整性審計 Abstract: 隨著云計算技術的快速發展和云存儲服務的日益…

計算機網絡-UDP協議

UDP(用戶數據報協議)是傳輸層的一種無連接、不可靠、輕量級的協議,適用于對實時性要求高、能容忍少量數據丟失的場景(如視頻流、DNS查詢等)。以下是UDP的詳細解析:1. UDP的核心特點特性說明無連接通信前無需…

子域名收集和c段查詢

子域名收集方法一、sitesite: 要查詢的域名可以查到相關網站二、oneforall (子域名查找工具)下載后解壓的文件夾在當前文件夾打開終端然后運行命令 python oneforall.py --target xxxxxxxx(這里放你要查的網址) run最…

計網-TCP擁塞控制

TCP的擁塞控制(Congestion Control)是核心機制之一,用于動態調整發送方的數據傳輸速率,避免網絡因過載而出現性能急劇下降(如丟包、延遲激增)。其核心思想是探測網絡可用帶寬,并在擁塞發生時主動…

依賴倒置原則 Dependency Inversion Principle - DIP

基本知識 1.依賴倒置原則(DIP)是面向對象設計(OOD)中的五個基本原則之一,通常被稱為 SOLID 原則中的 D 2.核心思想: 高層模塊不應該依賴低層模塊,兩者都應該依賴抽象。 (High-level modules sho…

原生input添加刪除圖標類似vue里面移入顯示刪除[jquery]

<input type"text" id"servicer-search" class"form-control" autocomplete"off" />上面是剛開始的input <div class"servicer-search-box"><input type"text" id"servicer-search" cla…

整理分享 | Photoshop 2025 (v26.5) 安裝記錄

導語&#xff1a; 最近整理資源時&#xff0c;發現有朋友在找新版 Photoshop。正好手邊有 Photoshop 2025年7月的版本&#xff08;v26.5&#xff09;&#xff0c;就記錄下來分享給大家&#xff0c;供有需要的朋友參考。關于這個版本&#xff1a;這個 Photoshop v26.5 安裝包&am…

【Redis】Redis 數據存儲原理和結構

一、Redis 存儲結構 1.1 KV結構 Redis 本質上是一個 Key-Value&#xff08;鍵值對&#xff0c;KV&#xff09;數據庫&#xff0c;在它豐富多樣的數據結構底層&#xff0c;都基于一種統一的鍵值對存儲結構來進行數據的管理和操作 Redis 使用一個全局的哈希表來管理所有的鍵值對…

【RAG優化】深度剖析OCR錯誤,從根源修復RAG應用的識別問題

1. 引言:OCR——RAG系統中的關鍵問題 當我們將一個包含掃描頁面的PDF或一張報告截圖扔給RAG系統時,我們期望它能“讀懂”里面的內容。這個“讀懂”的第一步,就是OCR。然而,OCR過程并非100%準確,它受到圖像質量、文字布局、字體、語言等多種因素的影響。 一個看似微不足道…

【第六節】方法與事件處理器

方法與事件處理器 方法處理器 可以用 v-on 指令監聽 DOM 事件: <div id="example"> <button v-on:click="greet">Greet</button></div>綁定一個單擊事件處理器到一個方法 greet 。下面在 Vue 實例中定義這個方法 var vm=new V…

大語言模型Claude 4簡介

Anthropic公司成立于2021年&#xff0c;由一群OpenAI前員工組成。他們最新發布的大語言模型(Large Language Model, LLM) Claude 4系列包括兩個版本&#xff1a;Claude Opus 4和Claude Sonnet 4&#xff1a;(1).Claude Sonnet 4&#xff1a;是Claude Sonnet 3.7的升級&#xff…

國產化PDF處理控件Spire.PDF教程:Python 將 PDF 轉換為 Markdown (含批量轉換示例)

PDF 是數字文檔管理的普遍格式&#xff0c;但其固定布局特性限制了在需要靈活編輯、更新或現代工作流集成場景下的應用。相比之下&#xff0c;Markdown&#xff08;.md&#xff09;語法輕量、易讀&#xff0c;非常適合網頁發布、文檔編寫和版本控制。 E-iceblue旗下Spire系列產…

PDF轉Markdown - Python 實現方案與代碼

PDF作為廣泛使用的文檔格式&#xff0c;轉換為輕量級標記語言Markdown后&#xff0c;可無縫集成到技術文檔、博客平臺和版本控制系統中&#xff0c;提高內容的可編輯性和可訪問性。本文將詳細介紹如何使用國產Spire.PDF for Python 庫將 PDF 文檔轉換為 Markdown 格式。 技術優…

深度解析 inaSpeechSegmenter:高效音頻語音分割與檢測開源工具

項目簡介 inaSpeechSegmenter 是法國國家視聽研究院(INA)開源的音頻分割與檢測工具,專為廣播、播客、采訪、影視等多媒體內容的自動化處理設計。它能夠高效地將長音頻自動分割為語音、音樂、噪聲、靜音等片段,并支持性別檢測(男聲/女聲),為后續的語音識別、內容檢索、轉…

VirtualBox安裝Ubuntu 22.04后終端無法打開的解決方案

問題現象在VirtualBox中使用"快速安裝"模式安裝Ubuntu 22.04后圖形終端&#xff08;gnome-terminal&#xff09;無法通過圖標或快捷鍵(CtrlAltT)啟動系統其他功能正常根本原因語言環境(Locale)配置異常導致&#xff1a;快速安裝模式可能跳過Locale生成步驟gnome-term…

java磁盤操作與IO流(序列化、Properties類)

目錄 一、磁盤操作 1、File類&#xff1a; &#xff08;1&#xff09;創建File對象&#xff1a; &#xff08;2&#xff09;獲取文件信息&#xff1a; &#xff08;3&#xff09;判斷文件 &#xff08;4&#xff09;刪除文件 &#xff08;5&#xff09;創建文件&#xff…