Spring中ApplicationContext和beanfactory區別

來源:互聯網
上載者:User

標籤:

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。

這個listener需要檢查contextConfigLocation參數。如果不存在的話,它將預設使用/WEB-INF/applicationContext.xml。如果它存在,它就會用預先定義的分隔字元(逗號,分號和空格)分開分割字串,並將這些值作為應用上下文將要搜尋的位置。ContextLoaderServlet可以用來替換ContextLoaderListener。這個servlet像listener那樣使用contextConfigLocation參數。


5.其它區別  
  1).BeanFactroy採用的是消極式載入形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),才對該Bean進行載入執行個體化,這樣,我們就不能發現一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤。 

  2).BeanFactory和ApplicationContext都支援BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊


Spring中ApplicationContext和beanfactory區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.