1. 程式人生 > >《spring技術內幕》學習(二)ioc容器實現

《spring技術內幕》學習(二)ioc容器實現

ioc容器和依賴反轉模式

在面向物件領域中,如果相互合作的物件的引用和依賴關係的管理由具體物件來完成,那麼會導致程式碼的高度耦合和可測試性的降低,這是非常不利的。而這些依賴關係可以通過把物件的依賴注入交給框架或者ioc容器來完成,這就是依賴控制反轉。
依賴控制反轉有很多種方式,在spring中,ioc容器是這個模式的載體,它可以通過介面注入、setter注入、構造器注入這三種主要方式完成依賴注入。同時依賴注入可以使遞迴的。
這裡有一個問題,就是什麼樣的物件適合依賴注入?通常來說,面向物件系統中有很大一部分物件是來處理資料的,這些物件並不常發生變化,是系統中的基礎部分,很多時候以單例模式存在,它們不涉及資料和狀態共享等問題。同時,如果這些物件之間的相互依賴關係也是比較穩定的,一般不會隨著系統執行狀態的改變而改變,這些特性使這些物件非常適合由ioc容器管理。

ioc容器的設計與實現

spring ioc容器的設計主要圍繞的是兩個核心介面:BeanFactory和ApplicationContext
其中BeanFactory是實現容器最基本功能的簡單容器,而ApplicationContext應用上下文是作為容器的高階形態存在,spring框架圍繞這兩個介面定義了一套複雜的介面繼承體系,用來抽象出容器的很多功能。簡單上個圖:
BeanFactory介面圖
在這些介面和類的繼承體系基礎上,spring通過定義BeanDefinition來管理物件,BeanDefinition抽象了我們對bean的定義。對ioc容器來說,BeanDefinition就是對依賴反轉模式中管理的物件依賴關係的資料抽象,也是容器實現依賴反轉功能的核心資料結構。
為了瞭解BeanFactory和ApplicationContext兩個核心介面的繼承體系,我們先看一下ioc容器主要的介面設計圖:
ioc容器介面設計圖


從圖中可以看到BeanFactory有一條主要的設計路徑,BeanFactory–>HierarchicalBeanFactory–>ConfigurableListableBeanFactory,其中BeanFactory定義了基本的ioc容器規範,HierarchicalBeanFactory繼承了BeanFactory介面後,增加了getParentBeanFactory()介面的功能,使BeanFactory具備了雙親ioc容器的管理功能

BeanFactory都定義了哪些介面呢?我們可以看一下spring原始碼的截圖:
BeanFactory的介面定義