BeanFacotry是spring中比較原始的Factory,。如XMLBeanFactory就是一種典型的BeanFactory。原始的BeanFactory無(wú)法支持spring的許多插件,,如AOP功能,、Web應(yīng)用等。
ApplicationContext接口,它由BeanFactory接口派生而來(lái),,因而提供BeanFactory所有的功能,。ApplicationContext以一種更向面向框架的方式工作以及對(duì)上下文進(jìn)行分層和實(shí)現(xiàn)繼承,ApplicationContext包還提供了以下的功能: · MessageSource, 提供國(guó)際化的消息訪問(wèn) · 資源訪問(wèn),,如URL和文件 · 事件傳播 · 載入多個(gè)(有繼承關(guān)系)上下文 ,,使得每一個(gè)上下文都專注于一個(gè)特定的層次,比如應(yīng)用的web層 1.利用MessageSource進(jìn)行國(guó)際化 BeanFactory是不支持國(guó)際化功能的,,因?yàn)锽eanFactory沒(méi)有擴(kuò)展Spring中MessageResource接口,。相反,由于ApplicationContext擴(kuò)展了MessageResource接口,因而具有消息處理的能力(i18N),,具體spring如何使用國(guó)際化,,以后章節(jié)會(huì)詳細(xì)描述。 2.強(qiáng)大的事件機(jī)制(Event) 基本上牽涉到事件(Event)方面的設(shè)計(jì),,就離不開(kāi)觀察者模式,。不明白觀察者模式的朋友,最好上網(wǎng)了解下,。因?yàn)?,這種模式在java開(kāi)發(fā)中是比較常用的,又是比較重要的,。 ApplicationContext的事件機(jī)制主要通過(guò)ApplicationEvent和ApplicationListener這兩個(gè)接口來(lái)提供的,,和java swing中的事件機(jī)制一樣。即當(dāng)ApplicationContext中發(fā)布一個(gè)事件的時(shí),,所有擴(kuò)展了ApplicationListener的Bean都將會(huì)接受到這個(gè)事件,,并進(jìn)行相應(yīng)的處理。 Spring提供了部分內(nèi)置事件,,主要有以下幾種: ContextRefreshedEvent :ApplicationContext發(fā)送該事件時(shí),,表示該容器中所有的Bean都已經(jīng)被裝載完成,此ApplicationContext已就緒可用 ContextStartedEvent:生命周期 beans的啟動(dòng)信號(hào) ContextStoppedEvent: 生命周期 beans的停止信號(hào) ContextClosedEvent:ApplicationContext關(guān)閉事件,,則context不能刷新和重啟,,從而所有的singleton bean全部銷毀(因?yàn)閟ingleton bean是存在容器緩存中的) 雖然,spring提供了許多內(nèi)置事件,,但用戶也可根據(jù)自己需要來(lái)擴(kuò)展spriong中的事物,。注意,要擴(kuò)展的事件都要實(shí)現(xiàn)ApplicationEvent接口,。 3.底層資源的訪問(wèn) ApplicationContext擴(kuò)展了ResourceLoader(資源加載器)接口,,從而可以用來(lái)加載多個(gè)Resource,而B(niǎo)eanFactory是沒(méi)有擴(kuò)展ResourceLoader 4.對(duì)Web應(yīng)用的支持 與BeanFactory通常以編程的方式被創(chuàng)建不同的是,,ApplicationContext能以聲明的方式創(chuàng)建,,如使用ContextLoader。當(dāng)然你也可以使用ApplicationContext的實(shí)現(xiàn)之一來(lái)以編程的方式創(chuàng)建ApplicationContext實(shí)例 ,。 ContextLoader有兩個(gè)實(shí)現(xiàn):ContextLoaderListener和ContextLoaderServlet,。它們兩個(gè)有著同樣的功能,除了listener不能在Servlet 2.2兼容的容器中使用,。自從Servelt 2.4規(guī)范,,listener被要求在web應(yīng)用啟動(dòng)后初始化。很多2.3兼容的容器已經(jīng)實(shí)現(xiàn)了這個(gè)特性,。使用哪一個(gè)取決于你自己,,但是如果所有的條件都一樣,,你大概會(huì)更喜歡ContextLoaderListener;關(guān)于兼容方面的更多信息可以參照ContextLoaderServlet的JavaDoc,。 這個(gè)listener需要檢查contextConfigLocation參數(shù),。如果不存在的話,它將默認(rèn)使用/WEB-INF/applicationContext.xml,。如果它存在,,它就會(huì)用預(yù)先定義的分隔符(逗號(hào),分號(hào)和空格)分開(kāi)分割字符串,,并將這些值作為應(yīng)用上下文將要搜索的位置,。ContextLoaderServlet可以用來(lái)替換ContextLoaderListener。這個(gè)servlet像listener那樣使用contextConfigLocation參數(shù),。
|
|