設計模式實戰:自定義SpringIOC(理論分析)

自定義SpringIOC(理論分析)

上一篇:設計模式開源實戰:觀察者模式不知道怎么用?手撕Spring源碼中跟著大佬學編程

上一篇我們研究了大佬在Spring源碼中使用的觀察者模式,今天我們再來聊聊Spring的核心功能——Sping IOC容器,最終我們跟著大佬的思路實現一個屬于自己的IOC容器!Start Go!

Spring IOC核心組件

1) BeanFactory

BeanFactory作為最頂層的一個接口,定義了IoC容器的基本功能規范。
在這里插入圖片描述
從類圖中我們可以發現最終的默認實現類是DefaultListableBeanFactory,它實現了所有的接口。那么為何要定義這么多層次的接口呢?
每個接口都有它的使用場合,主要是為了區分在 Spring 內部操作過程中對象的傳遞和轉化,對對象的數據訪問所做的限制。

例如,

  • ListableBeanFactory接口表示這些 Bean 可列表化。
  • HierarchicalBeanFactory表示這些 Bean 是有繼承關系的,也就是每個 Bean 可能有父 Bean
  • AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。

這三個接口共同定義了 Bean 的集合、Bean 之間的關系及 Bean 行為。

在 BeanFactory 里只對 IOC 容器的基本行為做了定義,根本不關心你的 Bean 是如何定義及怎樣加載的。正如我們只關心能從工廠里得到什么產品,不關心工廠是怎么生產這些產品的。

2 ) ApplicationContext

BeanFactory 有一個很重要的子接口,就是 ApplicationContext 接口,該接口主要來規范容器中的 bean 對象是非延時加載,即在創建容器對象的時候就對象 bean 進行初始化,并存儲到一個容器中。

//延時加載
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("bean.xml"));//立即加載
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user", User.class);

ApplicationContext 的子類主要包含兩個方面:

  • ConfigurableApplicationContext 表示該 Context 是可修改的,也就是在構建 Context 中用戶可以動態添加或修改已有的配置信息

  • WebApplicationContext 顧名思義,就是為 web 準備的 Context 他可以直接訪問到 ServletContext,通常情況下,這個接口使用少

要知道工廠是如何產生對象的,我們需要看具體的 IOC 容器的實現,Spring 提供了許多 IOC 容器實現,比如:

  • ClasspathXmlApplicationContext : 根據類路徑加載 xml 配置文件,并創建 IOC 容器對象。
  • FileSystemXmlApplicationContext :根據系統路徑加載 xml 配置文件,并創建 IOC 容器對象。
  • AnnotationConfigApplicationContext :加載注解類配置,并創建 IOC 容器。

在這里插入圖片描述
總體來說 ApplicationContext 必須要完成以下幾件事。

  • 標識一個應用環境
  • 利用 BeanFactory 創建 Bean 對象
  • 保存對象關系表
  • 能夠捕獲各種事件

3) Bean定義:BeanDefinition

這里的 BeanDefinition 就是我們所說的 Spring 的 Bean,我們自己定義的各個 Bean 其實會轉換成一個個 BeanDefinition 存在于 Spring 的 BeanFactory 中。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {//DefaultListableBeanFactory 中使用 Map 結構保存所有的 BeanDefinition 信息private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256); 
}   

BeanDefinition 中保存了我們的 Bean 信息,比如這個 Bean 指向的是哪個類、是否是單例的、是否懶加載、這個 Bean 依賴了哪些 Bean 等等。

4) BeanDefinitionReader

Bean 解析過程非常復雜,功能被分得很細,因為這里需要被擴展的地方很多,必須保證足夠的靈活性,以應對可能的變化。Bean的解析主要就是對 Spring 配置文件的解析。

這個解析過程主要通過 BeanDefinitionReader 來完成,看看 Spring 中 BeanDefinitionReader 的類結構圖,如下圖所示。
在這里插入圖片描述
BeanDefinitionReader 接口定義的功能

public interface BeanDefinitionReader {/*下面的loadBeanDefinitions都是加載bean定義,從指定的資源中*/int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException;int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException;int loadBeanDefinitions(String location) throws BeanDefinitionStoreException;int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException;
}

5) BeanFactory后置處理器

后置處理器是一種拓展機制,貫穿Spring Bean的生命周期

后置處理器分為兩類:

BeanFactory后置處理器:BeanFactoryPostProcessor

實現該接口,可以在spring的bean創建之前,修改bean的定義屬性
在這里插入圖片描述

public interface BeanFactoryPostProcessor {/**  該接口只有一個方法postProcessBeanFactory,方法參數是ConfigurableListableBeanFactory,通過該參數,可以獲取BeanDefinition*/void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

6) Bean后置處理器:BeanPostProcessor

BeanPostProcessor是Spring IOC容器給我們提供的一個擴展接口

實現該接口,可以在spring容器實例化bean之后,在執行bean的初始化方法前后,添加一些處理邏輯
在這里插入圖片描述

public interface BeanPostProcessor {//bean初始化方法調用前被調用Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;//bean初始化方法調用后被調用Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

IOC流程圖

在這里插入圖片描述

  1. 容器環境的初始化(系統、JVM 、解析器、類加載器等等)
  2. Bean 工廠的初始化( IOC 容器首先會銷毀舊工廠,舊 Bean 、創建新的工廠)
  3. 讀取:通過 BeanDefinitonReader 讀取我們項目中的配置(application.xml)
  4. 定義:通過解析 xml 文件內容,將里面的 Bean 解析成 BeanDefinition(未實例化、未初始化)
  5. 將解析得到的 BeanDefinition ,存儲到工廠類的Map容器中
  6. 調用 BeanFactoryPostProcessor 該方法是一種功能增強,可以在這個步驟對已經完成初始化的 BeanFactory 進行屬性覆蓋,或是修改已經注冊到 BeanFactory 的 BeanDefinition
  7. 通過反射實例化 bean 對象
  8. 進入到 Bean 實例化流程,首先設置對象屬性
  9. 檢查 Aware 相關接口,并設置相關依賴
  10. 前置處理器,執行 BeanPostProcesser 的before 方法對 bean 進行擴展
  11. 檢查是否有實現 initializingBean 回調接口,如果實現就要回調其中的 AftpropertiesSet() 方法,(通過可以完成一些配置的加載)
  12. 檢查是否有配置自定義的 init-method ,
  13. 后置處理器執行 BeanPostProcesser 的after 方法 --> AOP 就是在這個階段完成的, 在這里判斷 bean 對象是否實現接口,實現就使用 JDK 代理,否則選擇 CGLIB
  14. 對象創建完成,添加到BeanFactory的單例池中。

往期回顧

設計模式開源實戰:觀察者模式不知道怎么用?手撕Spring源碼中跟著大佬學編程

設計模式開源實戰:大佬是怎么使用工廠模式的?來看看Spring中工廠模式的應用就知道了

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

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

相關文章

人工智能如何改變項目管理:應用、影響與趨勢

人工智能如何改變項目管理&#xff1a;應用、影響與趨勢1. 人工智能如何提升項目規劃與進度安排2. 人工智能在資源分配與優化中的應用3. 人工智能用于風險管理4. 人工智能用于團隊協作與交流5. 人工智能用于項目監控與報告6. 集成人工智能的項目管理軟件6.1 Wrike6.2 ClickUp6.…

【MySql】事務的原理

? 【MySql】事務的原理數據庫的隔離級別原理讀未提交讀已提交可重復讀&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔離級別&#xff0c;強制事務串行執行&#xff0c;避免了所有并發問題&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目標檢測基礎

一、基本認知1.1目標檢測的定義目標檢測&#xff08;Object Detection&#xff09;&#xff1a;在圖像或視頻中檢測出目標圖像的位置&#xff0c;并進行分類和識別的相關任務。主要是解決圖像是什么&#xff0c;在哪里的兩個具體問題。1.2使用場景目標檢測的使用場景眾多&#…

GitLab 18.2 發布幾十項與 DevSecOps 有關的功能,可升級體驗【四】

沿襲我們的月度發布傳統&#xff0c;極狐GitLab 發布了 18.2 版本&#xff0c;該版本帶來了議題和任務的自定義工作流狀態、新的合并請求主頁、新的群組概覽合規儀表盤、下載安全報告的 PDF 導出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等幾十個重點功能的改進…

Python----大模型(大模型微調--BitFit、Prompt Tuning、P-tuning、Prefix-tuning、LORA)

一、大模型微調 1.1、解釋 微調(Fine-tuning)是在預訓練大模型基礎上&#xff0c;針對特定領域數據進行二次訓練的技術過程。這一過程使大型語言模型(如GPT、BERT等)能夠更好地適應具體應用場景&#xff0c;顯著提升在專業領域的表現。 1.2、微調的基本流程 模型選擇&#xf…

本地安裝 SQLite 的詳細步驟

方法 1:使用預編譯二進制文件 下載 SQLite: 訪問 SQLite 官方下載頁面。 下載 Precompiled Binaries for Windows 中的 sqlite-tools-win32-x86-*.zip。 解壓文件: 將下載的 ZIP 文件解壓到一個目錄(例如 C:\sqlite)。 配置環境變量: 右鍵「此電腦」→「屬性」→ 左側「高…

專題:2025醫藥生物行業趨勢與投融資研究報告|附90+份報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43444 圈內人都知道&#xff0c;2024年的BioChina展會現場&#xff0c;某跨國藥企高管盯著融資展板喃喃自語&#xff1a;“去年A輪平均3.2億&#xff0c;今年怎么降到2.1億了&#xff1f;” 這個細節&#xff0c;恰是行業寒冬的縮影…

Chroma安裝教程

Chroma 這里講述的是windows環境 下載Chroma安裝包 下載地址&#xff1a;https://github.com/chroma-core/chroma/releases 運行 chroma-windows.exe run --port 8000通過心跳檢測訪問是否正常 http://localhost:8000/api/v2/heartbeat快速使用 python安裝chromadb pyth…

kali Linux 2025.2安裝教程(解決安裝失敗-圖文教程超詳細)

一&#xff0c;下載鏡像&#xff1a; 進入官網&#xff1a;Get Kali | Kali Linux &#xff0c;往下滑 等待兩年半&#xff0c;鏡像下載好。 二&#xff0c;虛擬機安裝&#xff1a; 轉&#xff1a;VMware Workstation Pro 17 安裝圖文教程 知乎平臺&#xff1a;VMware Work…

uniapp項目使用ucharts實現折線圖詳細講解(案例)

1.在Hbuildx里面的工具>插件安裝&#xff0c;進入DCloud搜索uchart 2.點擊對應的項目導入該插件 可以看到在該目錄下有該插件 3.進入官網演示 - uCharts跨平臺圖表庫&#xff0c;找一個示例代碼測試一下&#xff0c;是否可以成功應用 因為這里使用的是vue2&#xff0c;如果你…

數據分析師進階——95頁零售相關數據分析【附全文閱讀】

這份資料適合零售行業從業者&#xff0c;尤其是服裝銷售領域的人員&#xff0c;能幫大家用數據分析提升銷售業績。資料先提出 “店鋪 20 問”&#xff0c;引導思考店鋪運營問題&#xff0c;接著點明數據分析對提升銷售、找出銷售不佳原因的重要性 。詳細介紹銷售業績相關公式及…

計算機組成原理(6) - 加法器

加法器是數字電路中用于執行加法運算的基本邏輯單元&#xff0c;廣泛應用于計算機、計算器、數字信號處理器等電子設備中。它能將兩個二進制數相加&#xff0c;并輸出結果及可能產生的進位。一、加法器的基本功能加法器的基本功能是在數字電路中對輸入的二進制數執行加法運算&a…

Qt 與 WebService 交互開發

在現代軟件開發中&#xff0c;WebService 已成為實現跨平臺、跨語言通信的重要標準。Qt 作為一個強大的跨平臺框架&#xff0c;提供了完善的工具和類庫來實現與 WebService 的交互。本文將深入探討 Qt 與 WebService 交互開發的核心技術和實踐經驗&#xff0c;包括 SOAP 協議實…

LLM 模型部署難題的技術突破:從輕量化到分布式推理的全棧解決方案

大語言模型(LLM)的部署一直是工業落地的核心挑戰。動輒百億甚至萬億參數的模型規模,對硬件資源、推理速度和系統穩定性提出了嚴苛要求。本文將系統剖析 LLM 部署中的關鍵技術瓶頸,從模型壓縮、推理加速到分布式架構設計,提供可落地的工程化解決方案,并附具體實現代碼。 …

理解訓練深度前饋神經網絡的困難—— 解鎖深度學習的關鍵鑰匙

2010年&#xff0c;深度學習先驅 Xavier Glorot 和 Yoshua Bengio 發表了這篇里程碑式的論文。它精準地診斷了當時阻礙深度神經網絡發展的核心頑疾——**梯度消失/爆炸問題**&#xff0c;并開出了革命性的“藥方”&#xff1a;**Xavier/Glorot 初始化**。這篇論文掃清了訓練深度…

Objective-c 初階——異常處理(try-catch)

一、try/catch/throw/finally 執行順序 void doSomething() {NSAutoreleasePool *pool [[NSAutoreleasePool alloc] init];try {// 這一步拋異常[self riskyMethod]; } catch (NSException *e) {throw; // 把異常繼續往上拋} finally {// ? 注意&#xff1a;這里的 finally…

計算機網絡:(十二)傳輸層(上)運輸層協議概述

計算機網絡&#xff1a;&#xff08;十一&#xff09;多協議標記交換 MPLS前言一、運輸層的作用二、基于端口的復用和分用功能三、屏蔽作用四、可靠信道與不可靠信道五、運輸層的兩個主要協議前言 前面我們講解了計算機網絡中網絡層的相關知識&#xff0c;包括網絡層轉發分組的…

一場關于電商零售增長破局的深圳探索

“電商AI&#xff0c;不再是選擇題”2025年&#xff0c;電商行業正面臨流量成本攀升、用戶留存率下降、供應鏈協同效率低等核心困境&#xff0c;傳統數字化工具已難以滿足精細化運營需求。在此背景下&#xff0c;百度智能云正加速布局電商領域&#xff0c;為零售企業提供從基礎…

當非洲愛上“中國制造”:如何贏在起跑線

非洲大陸的消費浪潮正以前所未有的速度奔涌。2025年前五個月&#xff0c;中非貿易額同比暴漲12.4%&#xff0c;創下歷史新高。在這片擁有14億人口的土地上&#xff0c;60%是30歲以下的年輕人&#xff0c;城鎮化浪潮席卷、中產階級快速崛起&#xff0c;從家電、汽車到建材、電子…

vLLM(3)vllm在線啟動集成openweb-ui

文章目錄**步驟 1: 啟動 vLLM 服務****方式 1: 直接命令行啟動****方式 2: Docker 啟動****步驟 2: 配置 Open WebUI 連接 vLLM****方法 1: 修改 Open WebUI 環境變量****方法 2: 通過 docker-compose.yml 部署****步驟 3: 在 Open WebUI 中添加模型****驗證是否成功****常見問…