Spring Boot 深入剖析:BootstrapRegistry 與 BeanDefinitionRegistry 的對比

在 Spring Boot 的啟動過程中,BootstrapRegistry?和?BeanDefinitionRegistry?是兩個名為“Registry”卻扮演著截然不同角色的核心接口。理解它們的差異是深入掌握 Spring Boot 啟動機制和進行高級定制開發的關鍵。

BootstrapRegistry?

	public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);}

當我們查看SpringBoot的啟動方法的源碼,我們發現run方法的源碼本質上是初始化了一個SpringApplication對象隨后調用其run方法來執行。我們點擊進去這個SpringApplication的構造方法中我們看到

	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));this.webApplicationType = WebApplicationType.deduceFromClasspath();this.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));this.mainApplicationClass = deduceMainApplicationClass();}

在SpringApplication這個構造方法初始化了兩個類分別是BootstrapRegistryInitializer和ApplicationContextInitializer,這兩個接口都是只有一個方法initialize,他們的作用則是分別對applicationContext和BootstrapRegistry來進行預處理,而BootstrapRegistry的作用則是體現在:當你需要創建一個?ApplicationContextInitializer?來定制應用上下文,但這個Initializer的邏輯依賴于一個特定的組件(例如,一個高級的?Decryptor?解密器用來解密數據庫密碼)。然而,這個?Decryptor?本身又可能依賴于Spring的環境配置(Environment),而?Environment?又是在ApplicationContext創建過程中才被完全初始化的。

這就形成了一個?啟動階段的循環依賴

  • 想創建?ApplicationContext?→ 需要先執行?ApplicationContextInitializer

  • 想執行?ApplicationContextInitializer?→ 需要先有?Decryptor?實例

  • 想創建?Decryptor?實例 → 又需要?Environment(它又來自于?ApplicationContext

BootstrapRegistry?的解決方案:
BootstrapRegistry?允許你在一切開始之前(在任何一個?ApplicationContextInitializer?執行之前),就通過?BootstrapRegistryInitializer?將像?Decryptor?這樣的關鍵組件作為完全實例化的對象注冊到一個臨時的“工具箱”里。

因此BootstrapRegistry?是啟動引導器,負責在最前期提供現成的工具實例。

BeanDefinitionRegistry?

對于BeanDefinitionRegistry?的實例化則是在BeanDefinitionRegistryPostProcessor的處理類當中的postProcessBeanDefinitionRegistry來對其進行實例化處理的。

  • 角色IoC 容器的建筑師

  • 定位:它是 Spring Framework 中?ApplicationContext?的核心接口,負責持有所有 Bean 的“藍圖”(BeanDefinition)。ApplicationContext?會根據這些藍圖來實例化、組裝和管理所有的Bean。它是Spring IoC容器的心臟。它定義了應用程序中所有組件的基本信息,但并不負責實例化,而是為后續的實例化、依賴注入提供元數據。它是正式舞臺的后臺策劃

也就是說當前容器內的bean所有信息都會放到BeanDefinitionRegistry?中來進行處理,BootstrapRegistry?的生命周期早于?BeanDefinitionRegistry。前者為后者的初始化過程提供支持,通常通過?ApplicationContextInitializer?將?BootstrapRegistry?中的實例“轉移”或“注冊”到?BeanDefinitionRegistry?中,使其成為被IoC容器管理的正式Bean

詳細對比

維度BeanDefinitionRegistryBootstrapRegistry
所屬階段ApplicationContext 階段?(主階段)Bootstrap 階段?(極早期)
核心目的注冊Bean的定義信息?(BeanDefinition),即如何創建Bean的藍圖注冊和持有完全實例化的對象實例,為引導過程提供現成的工具
注冊內容BeanDefinition?對象(包含類名、作用域、屬性值、初始化方法等元數據)。任何類型的對象實例?(如?RestTemplate,?Decryptor)。通過?Supplier?或?BootstrapRegistry.InstanceSupplier?延遲提供。
生命周期持久。與?ApplicationContext?同生命周期,伴隨整個應用運行。短暫。僅在 Bootstrap 階段有效。一旦?ApplicationContext?準備就緒,其使命基本完成,內容可被轉移到正式容器中。
接口方法registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
removeBeanDefinition(String beanName)
getBeanDefinition(String beanName)
register(Class<T> type, BootstrapRegistry.InstanceSupplier<T> instanceSupplier)
register(Class<T> type, Supplier<T> supplier)
isRegistered(Class<T> type)
依賴解決解決?Bean之間的循環依賴(通過三級緩存機制)。解決?啟動流程上的依賴問題(通過提前實例化關鍵對象,打破初始化順序的僵局)。
獲取方式通過?ApplicationContext?(即?BeanFactory) 的?getBean()?方法獲取最終Bean實例在?ApplicationContextInitializer?中,通過?BootstrapContext?的?get(Class<T> type)?方法獲取預先注冊的實例
典型應用注冊所有由?@Component,?@Bean,?@Service?等注解定義的組件。Spring Cloud Config:在獲取遠端配置前注冊安全的?RestTemplate
自定義引導:提前注冊解密器、自定義的?PropertySourceLoader?等。
設計模式工廠模式:存儲的是產品的設計圖,需要時再根據圖紙生產。倉庫模式:直接存儲了準備好的產品,需要時直接取用。

BootstrapRegistry?和?BeanDefinitionRegistry?是 Spring Boot 為解耦復雜的啟動過程、清晰劃分職責而設計的兩個互補的組件。它們并非競爭或替代關系,而是分別在不同的生命周期階段、為解決不同層面的問題而協同工作的伙伴。

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

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

相關文章

貪心算法應用:速率單調調度(RMS)問題詳解

Java中的貪心算法應用&#xff1a;速率單調調度(RMS)問題詳解 1. 速率單調調度(RMS)概述 速率單調調度(Rate Monotonic Scheduling, RMS)是一種廣泛應用于實時系統中的靜態優先級調度算法&#xff0c;屬于貪心算法在任務調度領域的經典應用。 1.1 基本概念 RMS基于以下原則&…

Cesium4--地形(OSGB到3DTiles)

1 OSBG OSGB&#xff08;OpenSceneGraph Binary&#xff09;是基于 OpenSceneGraph&#xff08;OSG&#xff09; 三維渲染引擎的二進制三維場景數據格式&#xff0c;廣泛用于存儲和傳輸傾斜攝影測量、BIM、點云等大規模三維模型&#xff0c;尤其在國產地理信息與智慧城市項目中…

多語言共享販賣機投資理財共享售賣機投資理財系統

多語言共享販賣機投資理財/共享售賣機分紅/充電寶/充電樁投資理財系統 采用thinkphp內核開發&#xff0c;支持注冊贈金、多級分銷&#xff0c;功能很基礎 修復后臺用戶列表管理 可自定義理財商品 多種語言還可以添加任意語言 源碼開源 多級分銷 注冊贈金等

[Windows] PDF 專業壓縮工具 v3.0

[Windows] PDF 專業壓縮工具 v3.0 鏈接&#xff1a;https://pan.xunlei.com/s/VOZwtC_5lCF-UF6gkoHuxWMoA1?pwdchg8# PDF 壓縮工具 3.0 新版功能特點 - 不受頁數限制&#xff01; 一、核心壓縮功能 1.多模式智能壓縮 支持 4 種壓縮模式&#xff1a;平衡模式&#xff08…

SHEIN 希音 2026 校招 內推 查進度

SHEIN 希音 2026 校招 內推 查進度 &#x1f3e2;公司名稱&#xff1a;SHEIN 希音 &#x1f4bb;招聘崗位&#xff1a;前端、后端、測試、產品、安全、運維、APP 研發、數據分析、設計師、買手、企劃、招商、管培生 &#x1f31f;內推碼&#xff1a;NTA2SdK &#x1f4b0;福利待…

ARM (6) - I.MX6ULL 匯編點燈遷移至 C 語言 + SDK 移植與 BSP 工程搭建

回顧一、核心關鍵字&#xff1a;volatile1.1 作用告訴編譯器&#xff1a;被修飾的變量會被 “意外修改”&#xff08;如硬件寄存器的值可能被外設自動更新&#xff09;&#xff0c;禁止編譯器對該變量進行優化&#xff08;如緩存到寄存器、刪除未顯式修改的代碼&#xff09;。本…

Vue中使用keep-alive實現頁面前進刷新、后退緩存的完整方案

Vue中使用keep-alive實現頁面前進刷新、后退緩存的完整方案 在Vue單頁應用中&#xff0c;路由切換時組件默認會經歷完整的銷毀-重建流程&#xff0c;這會導致兩個典型問題&#xff1a;從搜索頁跳轉到列表頁需要重新加載數據&#xff0c;而從詳情頁返回列表頁又希望保留滾動位置…

Visual Studio Code 安裝與更新故障排除:從“拒絕訪問”到成功恢復

Visual Studio Code 安裝與更新故障排除&#xff1a;從“拒絕訪問”到成功恢復的實踐分析 摘要&#xff1a; 本文旨在探討 Visual Studio Code (VS Code) 在安裝與更新過程中常見的故障&#xff0c;特別是涉及“拒絕訪問”錯誤、文件缺失以及快捷方式和任務欄圖標異常等問題。…

簡單UDP網絡程序

目錄 UDP網絡程序服務端 封裝 UdpSocket 服務端創建套接字 服務端綁定 運行服務器 UDP網絡程序客戶端 客戶端創建套接字 客戶端綁定 運行客戶端 通過上篇文章的學習&#xff0c;我們已經對網絡套接字有了一定的了解。在本篇文章中&#xff0c;我們將基于之前掌握的知識…

如何解決 pip install 安裝報錯 ModuleNotFoundError: No module named ‘requests’ 問題

Python系列Bug修復PyCharm控制臺pip install報錯&#xff1a;如何解決 pip install 安裝報錯 ModuleNotFoundError: No module named ‘requests’ 問題 摘要 在日常Python開發過程中&#xff0c;pip install 是我們最常用的依賴安裝命令之一。然而很多開發者在 PyCharm 控制臺…

解釋 ICT, Web2.0, Web3.0 這些術語的中文含義

要理解“ICT Web2.0”術語的中文含義&#xff0c;需先拆解為 ICT 和 Web2.0 兩個核心概念分別解析&#xff0c;再結合二者的關聯明確整體指向&#xff1a; 1. 核心術語拆解&#xff1a;中文含義與核心定義 &#xff08;1&#xff09;ICT&#xff1a;信息與通信技術 中文全稱&am…

IDEA版本控制管理之使用Gitee

使用Gitee如果之前沒用過Gitee&#xff0c;那么IDEA中應該長這樣&#xff08;第一次使用&#xff09;如果之前使用過Gitee&#xff0c;那么IDEA中應該長這樣這種情況&#xff0c;可以先退出Gitee&#xff0c;再拉取Gitee&#xff0c;退出Gitee方法見文章底部好&#xff0c;那么…

NLP(自然語言處理, Natural Language Processing)

讓計算機能夠理解、解釋、操縱和生成人類語言&#xff0c;從而執行有價值的任務。 關注社區&#xff1a;Hugging Face、Papers With Code、GitHub 是現代NLP學習不可或缺的資源。許多最新模型和代碼都在這里開源。 ①、安裝庫 pip install numpy pandas matplotlib nltk scikit…

后端json數據反序列化枚舉類型不匹配的錯誤

后端json數據反序列化枚舉類型不匹配的錯誤后端返回的json格式在前端反序列化報錯System.Text.Json.JsonException:“The JSON value could not be converted to TodoReminderApp.Models.Priorityen. Path: $.Data.Items.$values[0].Priority | LineNumber: 0 | BytePositionIn…

市面上主流接口測試工具對比

公司計劃系統的開展接口自動化測試&#xff0c;需要我這邊調研一下主流的接口測試框架給后端測試&#xff08;主要測試接口&#xff09;的同事介紹一下每個框架的特定和使用方式。后端同事根據他們接口的特點提出一下需求&#xff0c;看哪個框架更適合我們。 2025最新Jmeter接口…

2025.2.4 更新 AI繪畫秋葉aaaki整合包 Stable Diffusion整合包v4.10 +ComfyUI 整合包下載地址

2025.2.4 更新 AI繪畫秋葉aaaki整合包 Stable Diffusion整合包v4.10 ComfyUI 整合包下載地址Stable Diffusion整合包【下載鏈接】ComfyUI整合包【下載鏈接】【報錯解決】Stable Diffusion整合包 【下載鏈接】 下載地址 https://uwtxfkm78ne.feishu.cn/wiki/GHgVwA2LPiE9x2kj4W…

Nginx優化與 SSL/TLS配置

1、隱藏版本號可以使用Fiddler工具抓取數據包&#xff0c;查看Nginx版本&#xff0c;也可以在CentOS中使用命令curl -I http://192.168.10.23 顯示響應報文首部信息。方法一&#xff1a;方法一&#xff1a;修改配置文件方式 vim /usr/local/nginx/conf/nginx.conf http {includ…

JavaWeb05

一、Listener監聽器1、簡介Listener是Servlet規范中的一員在Servlet中&#xff0c;所有的監聽器接口都是以Listener結尾監聽器實際上是Servlet規范留給JavaWeb程序員的一些特殊時機當在某些時機需要執行一段Java代碼時&#xff0c;可以用對應的監聽器2、常用的監聽器接口&#…

科普:在Windows個人電腦上使用Docker的極簡指南

在Windows個人電腦上使用Docker的極簡指南&#xff1a; 1. 快速安裝 下載安裝包&#xff08;若進不了官網&#xff0c;則可能要科學上網&#xff09; 訪問Docker Desktop官方下載頁 訪問Docker官網 選擇Windows及&#xff08;AMD64 也稱為 x86-64&#xff0c;是目前主流 PC的…

【開題答辯全過程】以 “居逸”民宿預訂微信小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…