Spring Beans模組原始碼分析

2021-08-08 14:03:57 字數 1387 閱讀 7357

spring-beans模組是spring三大核心模組(spring-beans,spring-core,spring-context)之一,bean 在 spring 中作用就像 object 對 oop 的意義一樣,沒有物件的概念就像沒有物件導向程式設計,spring 中沒有 bean 也就沒有 spring 存在的意義。為什麼要 bean 這種角色 bean 或者為何在 spring 如此重要,這由 spring 框架的設計目標決定,spring 為何如此流行,我們用 spring 的原因是什麼,想想你會發現原來 spring 解決了乙個非常關鍵的問題他可以讓你把物件之間的依賴關係轉而用配置檔案來管理,也就是他的依賴注入機制。bean 元件在 spring 的 org.springframework.beans 包下。這個包下的所有類主要解決了三件事:bean 的定義、bean 的建立以及對 bean 的解析。

spring bean 的建立時典型的工廠模式,他的頂級介面是 beanfactory,下圖是這個工廠的繼承層次關係:

beanfactory 有三個子類:listablebeanfactory、hierarchicalbeanfactory 和 autowirecapablebeanfactory。但是從上圖中我們可以發現最終的預設實現類是 defaultlistablebeanfactory,他實現了所有的介面。那為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明發現,每個介面都有他使用的場合,它主要是為了區分在 spring 內部在操作過程中物件的傳遞和轉化過程中,對物件的資料訪問所做的限制。例如 listablebeanfactory 介面表示這些 bean 是可列表的,而 hierarchicalbeanfactory 表示的是這些 bean 是有繼承關係的,也就是每個 bean 有可能有父 bean。autowirecapablebeanfactory 介面定義 bean 的自動裝配規則。這四個介面共同定義了 bean 的集合、bean 之間的關係、以及 bean 行為。

bean 的定義主要有 beandefinition 描述,如下圖說明了這些類的層次關係:

bean 的定義就是完整的描述了在 spring 的配置檔案中你定義的 節點中所有的資訊,包括各種子節點。當 spring 成功解析你定義的乙個 節點後,在 spring 的內部他就被轉化成 beandefinition 物件。以後所有的操作都是對這個物件完成的。

bean 的解析過程非常複雜,功能被分的很細,因為這裡需要被擴充套件的地方很多,必須保證有足夠的靈活性,以應對可能的變化。bean 的解析主要就是對 spring 配置檔案的解析。這個解析過程主要通過下圖中的類完成:

Mybatis中Logging模組的原始碼分析

週末又來到了公司吹吹空調,順便記錄下mybatis的點點滴滴。首先mybatis不定義日誌系統,完全依賴於第三方系統完成日誌記錄,利用介面卡模式完成實際操作,原始碼如下 1 定義乙個log介面,具有如下方法 public inte ce log2 然後引入第三方日誌,比如 loggingimpl,實...

Python bisect模組的使用與原始碼分析

本文基於python3.7分析 bisect提供了六個方法 不難發現,bisect 方法和bisect right 方法以及insort 方法和insort right 方法功能一致,在下面原始碼分析中會有解釋 import bisect l 1,2,4,4,5 n 4 idx1 bisect.bi...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...