通俗理解spring源碼(一)—— 容器的基本實現

来源:https://www.cnblogs.com/xiaohang123/archive/2020/04/10/12676754.html
-Advertisement-
Play Games

通俗理解spring源碼(一)—— 容器的基本實現 大家都知道spring的主要功能就是將本來由我們程式員new出來的對象,交給spring管理。這個管理不僅包括實例化的過程,還包括依賴註入等整個bean生命周期的管理。而spring是通過一個容器,來管理所有bean的。 spring容器的概念,和 ...


通俗理解spring源碼(一)—— 容器的基本實現

大家都知道spring的主要功能就是將本來由我們程式員new出來的對象,交給spring管理。這個管理不僅包括實例化的過程,還包括依賴註入等整個bean生命周期的管理。而spring是通過一個容器,來管理所有bean的。

spring容器的概念,和現實生活中容器的概念是差不多的,即一個可容納物體的東西,杯子可以裝水,杯子是個容器,衣櫃可以裝衣服,衣櫃是一個容器。那麼抽象到java中,能存放對象的東西,就是一個容器,在spring中,容器通常用map或list等集合來實現,然後再通過一個對象來引用這個集合,那麼這個對象也叫做一個容器,spring把這個對象叫做beanFactory。

那麼這個容器是如何初始化的?簡單一句話就是,通過我們配置的xml文件或者註解,來告訴spring你想實例化怎樣的一個bean?這個bean的屬性是怎樣的?與其他bean的依賴關係?等等,spring通過一系列複雜的過程,初始化該容器,我們需要什麼對象,直接從容器中拿就好了。

關於spring的容器,涉及的類就多了,我的學習方法是,先不看具體的方法和實現,首先從一些核心的介面和抽象類著手,配合類的層次結構圖,瞭解整體的結構和功能。而關於這些介面和抽象類,首先從名稱上就能大致知道其功能,因為spring官方的命名是非常規範的, 所以有一定的英語基礎對學習源碼是很有幫助的。瞭解了這些介面的功能後,在源碼中看到這個名稱,就知道是乾什麼的了,不至於跳來跳去,而暈頭轉向。

 

 

 

 真正的容器是DefaultListableBeanFactory,他是通過層層繼承而來的,從上圖可以很清晰的(請選擇性忽略圖片的清晰度)從全局角度瞭解DefaultListableBeanFactory的脈絡,他的父親、爺爺、曾爺爺都在上面了,只要知道了他祖宗十八代的功能,就可以知道DefaultListableBeanFactory的功能了。

  •  AliasRegistry:別名註冊中心,註冊中心相當於登記處,提供了對別名的註冊,還包括增刪改查等操作,由於介面中不能有成員變數(非常量),所以一定會有一個實現類中通過一個容器保存別名,其他介面也類似。
  • SimpleAliasRegistry:簡單別名註冊中心,是介面AliasRegistry的實現,增加了一個map容器來保存別名。
  • SingletonBeanRegistry:單例bean的註冊中心,顧名思義,該介面定義了對單例bean的註冊及獲取,
  • BeanFactory:bean的工廠,用來存放bean,定義獲取bean及bean的各種屬性。
  • DefaultSingletonBeanRegistry:為SingletonBeanRegistry的預設實現,定義了一個容器保存所有單例bean,同時繼承了SimpleAliasRegistry,所以該類既是一個單例bean的註冊中心,也是別名的註冊中心。
  • HierarchicalBeanFactory:有層級的bean工廠,在BeanFactory定義的功能的基礎上增加了對parentFactory的支持。
  • BeanDefinitionRegistry:BeanDefinition的註冊中心,定義對BeanDefinition的增刪改查(BeanDefinition就是對bean的描述,包括bean的class、scope、id等,以後會詳細介紹)。
  • FactoryBeanRegistrySupport:FactoryBean註冊的支持,在DefaultSingletonBeanRegistry基礎上增加了對FactoryBean的特殊處理功能(FactoryBean是工廠bean,BeanFactory是bean工廠,以後會詳細介紹)。
  • ConfigurableBeanFactory:可配置的bean工廠,提供配置Factory的各種方法。
  • ListableBeanFactory:可列舉的bean工廠,提供了getBean等根據各種條件獲取bean的方法。
  • AbstractBeanFactory:抽象bean工廠,綜合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
  • AutowireCapableBeanFactory:可自動註入的bean工廠,提供創建bean、自動註入、初始化以及應用bean的後處理器。
  • AbstractAutowireCapableBeanFactory:抽象的可自動註入的bean工廠,綜合AbstractBeanFactory並對介面AutowireCapableBeanFactory進行實現。
  • ConfigurableListableBeanFactory:可配置、可列舉的bean工廠,beanFactory配置清單,指定忽略類型及介面等。
  • DefaultListableBeanFactory:綜合上面所有功能,即可配置、可列舉、可處理依賴註入、可處理factoryBean,既是bean工廠,也是BeanDefinition、Alias的註冊中心,還能引用父容器。是真正的spring容器,beanDefinition的註冊以及單例bean的實例化等功能都由他來完成。

 到目前為止,只是介紹了與spring容器相關核心類的大致介紹,個人覺得看完後只要有個大致印象,看到某個介面名或類名,能夠記起他的大致功能,那麼本文的目的就達到了。

接下來的博客中,會從載入xml配置文件開始,解開spring容器初始化的謎底。

參考:spring源碼深度解析。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以前用wordpress搭建的網站,顯示php版本需要更新了。 於是登錄寶塔面板 登錄後,選擇軟體商店 運行環境 選擇要安裝的PHP版本安裝 安裝完成後,選擇網站 設置 選擇PHP版本,切換為剛剛安裝好的版本,切換成功。 ...
  • java是一個面向對象的高級編程語言。 JDK發展史: 1995年Sun公司發佈Java 1.0 版本(初始化版本,出生的版本號) 1997年發佈Java 1.1版本 1998年發佈Java 1.2版本 2000年發佈Java 1.3版本 2002年發佈Java 1.4版本 2004年發佈Java ...
  • go語言基礎(一) package + package 調用 Go 程式是通過 package 來組織的。 只有 package 名稱為 main 的源碼文件可以包含 main 函數。 個可執行程式有且僅有一個 main 包。 通過 import 關鍵字來導入其他非 main 包。 可以通過 imp ...
  • public class CopyTextByBuf { public static void main(String[] args) { BufferedReader bufr = null; BufferedWriter bufw = null; try { bufr = new Buffere ...
  • 鏡像用法 修改 composer 的全局配置文件(推薦方式) 打開命令行視窗(windows用戶)或控制台(Linux、Mac 用戶)並執行如下命令: composer config -g repo.packagist composer https://packagist.phpcomposer.c ...
  • 緩衝區的出現提高了對數據的讀寫效率。 緩衝區要結合流才可以使用。 在流的基礎上對流的功能進行了增強。 該緩衝區提供了跨平臺的換行符。newLine(); public class BufferedWriterDemo { public static void main(String[] args) ...
  • 作者: "DeppWang" 、 "原文地址" 人生在世,誰不面試。單例模式:一個搞懂不加分,不搞懂減分的知識點 又一篇一抓一大把的博文,可是你真的的搞懂了嗎?點開看看。。事後,你也來一篇。 單例模式是面試中非常喜歡問的了,我們往往自認為已經完全理解了,沒什麼問題了。但要把它手寫出來的時候,可能出現 ...
  • 使用 pip 安裝 pipenv pip install pipenv 拋出錯誤異常 連接超時 time out 解決方案 更換國內資源 操作: 在C:\Users\Administrator\下新建pip文件夾,在創建pip.ini文件,拷貝下麵代碼進去,保存 切換下載源地址為 [global] ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...