Spring學習(十)BeanFactory VS ApplicationContext

BeanFactory是Spring框架最核心的接口,它提供了高級IoC的配置機制。
ApplicationContext建立在BeanFactory基礎之上,提供了更多面嚮應用的功能,它提供了國際化支持和框架事件體系,更易於創建實際應用一般成BeanFactory爲IoC容器,而稱ApplicationContext爲應用上下文。但有時爲了方便,我們也將其成爲Spring容器。

Spring通過一個描述文件來描述Bean和Bean之間的依賴關係,然後利用java語言的反射機制實例化Bean並建立Bean之間的依賴關係。
Spring的IoC容器在完成這些底層工作的基礎之上,還提供Bean的實例緩存、生命週期管理、Bean的實例代理、事件發佈以及資源裝載等高級服務。

首先先來介紹一下BeanFactory

BeanFactory和傳統的類工廠還是有所不同的:
傳統的類工廠只負責一個或者幾個類的實例
而BeanFactory是類通用工廠,他可以創建並管理各種類的通用對象。這些可被創建和管理的類對象本身並沒有什麼特別之處。他們僅僅是一個POJO,Spring稱這些被創建和管理的對象爲Bean。所有可以被Spring容器實例化和管理的類都可以被成爲JavaBean
觀察一下BeanFactory的體系結構:
BeanFactory位於類結構樹的頂端,其主要的方法就是getBean,該方法從容器中返回特定名稱的Bean。
BeanFactory的功能通過其他的接口得到不斷的擴展,接下來對涉及到的其他接口進行聲明:
1.    XmlBeanFactory
2.    ListableBeanFactory:定義了訪問容器中bean的基本信息的若干方法,如查看bean的個數,獲取某一類型bean的配置名稱,或者查看容器中是否包含某一bean等等這些方法。
3.    HierarhicalBeanFactory:父子級聯IoC容器的接口,子容器可以通過接口方法訪問父容器。
4.    ConfigurableBeanFactory:增強了IoC容器的可定製性。他定義了設置類裝載器、屬性編輯器、容器初始化後置處理器等等方法。
5.    AutowireCapableBeanFactory:將容器中的bean按照某種規則比如:按照名稱匹配,按照類型匹配等等來進行自動裝配的方法。
6.    SingletonBeanFactory:在容器運行期間向容器註冊單實例bean的方法
7.    BeanDefinitionRegistry:Spring配置文件中,每一個bean節點元素在Spring容器裏面都通過一個BeanDefinition對象來表示,他描述了Bean的配置信息。BeanDefinitionRegistry接口提供了向容器手工註冊BeanDefinition對象的方法。

BeanFactory的初始化順序如下:
1.    首先創建相關的配置文件
2.    Spring通過BeanFactory來裝載配置文件
3.    啓動IoC容器
4.    獲取Bean實例
其中:通過BeanFactory啓動IoC實例時並不會初始化配置文件當中定義的Bean,初始化的操作發生在第一個調用的時候。對於單實例的Bean來說BeanFactory會緩存Bean的實例,所以第二次使用getBean的方法時就可以直接從IoC容器的緩存中來獲取Bean的實例了。
另外,在初始化BeanFactory時必須爲其提供一種日誌框架,我們使用的是Log4J,即在類路徑下提供Log4J的配置文件,這樣啓動Spring容器時纔不會報錯。

接下來介紹ApplicationContext

ApplicationContext由BeanFactory派生而來,提供了更多面向實際應用的功能。在BeanFactory中,很多功能需要以編程的方式方式實現,而在ApplicationContext中則可以通過配置的方式實現。接下來介紹一下ApplicationContext的實現類以及類體系結構。
具體實現類:
1.    ClassPathXmlApplicationContext:從類路徑中加載配置文件
2.    FileSystemXmlApplicationContext:從文件系統中來加載配置文件
3.    ConfigurableApplicationContext:擴展自ApplicationContext,新增加了兩個方法reflesh、close。這讓ApplicationContext具有啓動、刷新和關閉應用上下文的能力。在應用上下文關閉的情況下調用reflesh即可啓動應用上下文,在已經啓動的狀態下調用reflesh即可清除緩存並且重新裝載配置信息,調用close方法則可以關閉應用上下文。
接下來我們瞭解下ApplicationContext的類集成體系
ApplicationContext通過許多其他接口擴展了BeanFactory的功能,其中包括:
1.    ApplicationEventPublisher:他讓容器擁有發佈應用上下文事件的功能
2.    MessageSource:他爲容器提供了I18N國際化信息訪問的功能
3.    ReaourcePatternResolver:可以通過帶前綴Ant風格的資源類文件路徑來裝載Spring的配置文件。
4.    LifeCycle:Spring2.0加入的接口,提供start和stop兩個方法,主要用於處理異步控制的過程。
和BeanFactory初始化相似,ApplicationContext的初始化也很簡單,根據配置文件路徑不同可以選擇不同的實現類加載:
•    配置文件在類路徑下:ClassPathXmlApplicationContext
•    配置文件放在文件系統路徑下:FileSystemXmlApplicationContext
在獲取了ApplicationContext實例之後,就可以像BeanFactory一樣來調用getBean來返回Bean的實例。

ApplicationContext的初始化和BeanFactory有一個很大的區別:
BeanFactory在初始化容器的時候並沒有實例化Bean,直到第一次訪問Bean時才實例化目標Bean。
ApplicationContext在初始化應用上下文時就初始化了所有單實例Bean。
因此,ApplicationContext的初始化時間會比BeanFactory長

ApplicationContext和BeanFactory另一個最大的不同之處在於
前者會利用Java反射機制自動識別出配置文件中定義的BeanPostProcessor、InstantiationAwareBeanPostProssor和BeanFactoryProcessor並自動將他們註冊到應用上下文中。
而後者需要在代碼中通過手工調用addBeanPostProcessor方法來進行註冊。
這也就是我們在開發中經常使用ApplicationContext而不使用BeanFactory的原因之一。
在ApplicationContext中我們只需要在配置文件中通過Bean定義工廠後處理器和Bean後處理器他們就會按預期的方式來運行。

總結:
對於BeanFactory和ApplicationContext兩者的用途,我們可以進行簡單的劃分:
BeanFacroty是Spring框架的基礎設施,是面向Spring本身的。
ApplicationContext是面向使用Spring框架的開發者。
幾乎所有的場合我們都直接使用ApplicationContext而非底層的BeanFactory。

發佈了68 篇原創文章 · 獲贊 132 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章