天天看點

Spring中ApplicationContext和beanfactory差別

BeanFacotry是spring中比較原始的Factory。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory無法支援spring的許多插件,如AOP功能、Web應用等。 

  ApplicationContext接口,它由BeanFactory接口派生而來,因而提供BeanFactory所有的功能。ApplicationContext以一種更向面向架構的方式工作以及對上下文進行分層和實作繼承,ApplicationContext包還提供了以下的功能: 

  • MessageSource, 提供國際化的消息通路  

  • 資源通路,如URL和檔案  

  • 事件傳播  

  • 載入多個(有繼承關系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層  

1.利用MessageSource進行國際化  

  BeanFactory是不支援國際化功能的,因為BeanFactory沒有擴充Spring中MessageResource接口。相反,由于ApplicationContext擴充了MessageResource接口,因而具有消息處理的能力(i18N),具體spring如何使用國際化,以後章節會較長的描述。 

2.強大的事件機制(Event)  

  基本上牽涉到事件(Event)方面的設計,就離不開觀察者模式。不明白觀察者模式的朋友,最好上網了解下。因為,這種模式在java開發中是比較常用的,又是比較重要的。 

ApplicationContext的事件機制主要通過ApplicationEvent和ApplicationListener這兩個接口來提供的,和java swing中的事件機制一樣。即當ApplicationContext中釋出一個事件的時,所有擴充了ApplicationListener的Bean都将會接受到這個事件,并進行相應的處理。 

Spring提供了部分内置事件,主要有以下幾種:  

ContextRefreshedEvent :ApplicationContext發送該事件時,表示該容器中所有的Bean都已經被裝載完成,此ApplicationContext已就緒可用 

ContextStartedEvent:生命周期 beans的啟動信号  

ContextStoppedEvent: 生命周期 beans的停止信号  

ContextClosedEvent:ApplicationContext關閉事件,則context不能重新整理和重新開機,進而所有的singleton bean全部銷毀(因為singleton bean是存在容器緩存中的) 

  雖然,spring提供了許多内置事件,但使用者也可根據自己需要來擴充spriong中的事物。注意,要擴充的事件都要實作ApplicationEvent接口。  

3.底層資源的通路  

  ApplicationContext擴充了ResourceLoader(資源加載器)接口,進而可以用來加載多個Resource,而BeanFactory是沒有擴充ResourceLoader 

4.對Web應用的支援  

  與BeanFactory通常以程式設計的方式被建立不同的是,ApplicationContext能以聲明的方式建立,如使用ContextLoader。當然你也可以使用ApplicationContext的實作之一來以程式設計的方式建立ApplicationContext執行個體 。 

ContextLoader有兩個實作:ContextLoaderListener和ContextLoaderServlet。它們兩個有着同樣的功能,除了listener不能在Servlet 2.2相容的容器中使用。自從Servelt 2.4規範,listener被要求在web應用啟動後初始化。很多2.3相容的容器已經實作了這個特性。使用哪一個取決于你自己,但是如果所有的條件都一樣,你大概會更喜歡ContextLoaderListener;關于相容方面的更多資訊可以參照ContextLoaderServlet的JavaDoc。