bean元件在spring的org.springframework.beans包下。在這個包下的所有類主要解決了3件事:bean的定義、bean的建立及對bean的解析。對spring的使用者來說唯一需要關心的就是bean的建立,其他兩個由spring在內部幫你完成,對你來說是透明的。
spring bean的建立是典型的工廠模式,他的頂級介面是beanfactory。
beanfactory有3個子類:listablebeanfactory、hierarchicalbeanfactory、autowirecapablebeanfactory。但是我們可以發現最終的預設實現類是defaultlistablebeanfactory,他實現了所有的介面。為何要定義這麼多層次的介面呢?查閱這些介面的原始碼和說明可以發現每個介面都有他使用的場合,他主要是為了區分在springn內部物件的傳遞和**過程中,對物件的資料訪問所做的限制。例如,listablebeanfactory介面表示這些bean是可列表的,而hierarchicalbeanfactory表示這些bean是有繼承關係的,也就是每個bean有可能有父bean,autowirecapablebeanfactory介面定義bean的自動裝配規則。這4個介面共同定義了bean的集合、bean之間的關係和bean的行為。
bean的定義主要由beandefinition描述。
bean的定義完整的描述了在spring的配置檔案中你定義的節點中所有的資訊,包括各種子節點。當spring成功解析你定義的乙個節點後,在spring的內部他就被轉化成beandefinition物件,以後所有的操作都是對這個物件進行的。
bean的解析過程非常複雜,功能被分得很細,因為這裡需要被擴充套件的地方很多,必須保證有足夠的靈活性,以及對可能的變化。bean的解析主要就是對spring配置檔案的解析。
當然還有對tag的具體解析,在這裡並沒有列出。
context在spring的org.springframework.context包下,他實際上就是給spring提供乙個執行時的環境,用以儲存各個物件的狀態。下面看一下這個環境是如何構建的。
再往下分就是構建context的檔案型別,接著就是訪問context的方式。這樣一級一級構成了完整的context等級層次。
context作為spring的ioc容器,基本上整合了spring的大部分功能,或者說是大部分功能的基礎。
core元件作為spring的核心元件,其中包含了很多關鍵類,乙個重要的組成部分就是定義了資源的訪問方式。這種把所有資源都抽象成乙個介面的方式很值得在以後的設計中拿來學習。
resource介面封裝了各種可能的資源型別,也就是對使用者來說遮蔽了檔案型別的不同。對資源的提供者來說,如何把資源包裝起來交給其他人用也是乙個問題,我們看到resource介面繼承了inputstreamsource介面,在這個介面中有個getinputstream方法,返回的是inputstream類。這樣所有的資源都可以通過inputstream類來獲取,所以也遮蔽了資源的提供者。另外還有乙個載入資源的問題,也就是資源的載入者要統一,這個任務是由resourceloader介面完成的,他遮蔽了所有的資源載入者的差異,只需要實現這個介面就可以載入所有的資源,他的預設實現是defaultresourceloader。
context把資源的載入、解析和描述工作委託給了resourcepatternresolver類來完成,他相當於乙個接頭人,他把資源的載入、解析和資源的定義整合在一起便於其他元件使用。在core元件中還有很多類似的方式。
Spring核心元件分析
1 spring理念剖析 spring總共有十幾個元件,但真正核心的只有三個 core context和bean。我們將從這三個元件入手來分析spring。spring之中最重要的當屬bean了,spring實際上就是面向bean的程式設計,bean對於spring的意義就好比object對於oop...
Spring元件掃瞄詳解
最近使用spring,發現有很多依賴注入的內容,特別是dao,百思不得其解,後來才知道是spring的依賴注入。spring可以批量將乙個目錄下所有的植入 repository 註解或者 service 註解的元件類一次性掃瞄出來。xml version 1.0 encoding utf 8 bea...
Spring元件掃瞄詳解
最近使用spring,發現有很多依賴注入的內容,特別是dao,百思不得其解,後來才知道是spring的依賴注入。spring可以批量將乙個目錄下所有的植入 repository 註解或者 service 註解的元件類一次性掃瞄出來。xml version 1.0 encoding utf 8 bea...