spring 中beanFactory和ApplicationContext的區別

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實例 。 

5.其它區別 
  1).BeanFactroy採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化,這樣,咱們就不能發現一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啓動時,一次性建立了全部的Bean。這樣,在容器啓動時,咱們就能夠發現Spring中存在的配置錯誤。 

  2).BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但二者之間的區別是:BeanFactory須要手動註冊,而ApplicationContext則是自動註冊
相關文章
相關標籤/搜索