Spring BeanFactory和ApplicationContext

BeanFactory和ApplicationContext均可以用一bean的加載、實例化和維護,BeanFactorty接口提供了配置框架及基本功能,可是沒法支持spring的aop功能和web應用。ApplicationContext接口做爲BeanFactory的派生,於是提供BeanFactory全部的功能。並且ApplicationContext還在功能上作了擴展,相較於BeanFactorty,ApplicationContext還提供瞭如下的功能:web

(1)MessageSource, 提供國際化的消息訪問
(2)資源訪問,如URL和文件
(3)事件傳播特性,即支持aop特性
(4)載入多個(有繼承關係)上下文 ,使得每個上下文都專一於一個特定的層次,好比應用的web層 spring

3. 經常使用的獲取ApplicationContext的方法:
FileSystemXmlApplicationContext:從文件系統或者url指定的xml配置文件建立,參數爲配置文件名或文件名數組
ClassPathXmlApplicationContext:從classpath的xml配置文件建立,能夠從jar包中讀取配置文件編程

WebApplicationContextUtils:從web應用的根目錄讀取配置文件,須要先在web.xml中配置,能夠配置監聽器或者servlet來實現數組


如下經過聲明方式,便可使用ApplicationContext應用上下文加載bean,若是web.xml中不加以下監聽器也能夠,只不過默認使用了BeanFactory做爲bean工廠bash

Bean工廠加載bean以後不會立刻實例化,在bean第一次使用時才真正實例化,且實例化的bean都是單例的,而經過應用上下文加載的單例bean在加載的時候會當即初始化app

複製代碼
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>複製代碼
複製代碼


這兩種方式都默認配置文件爲web-inf/applicationContext.xml,也可以使用context-param指定配置文件框架

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>複製代碼


3、兩者區別url

1.BeanFactroy採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化,這樣,咱們就不能發現一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啓動時,一次性建立了全部的Bean。這樣,在容器啓動時,咱們就能夠發現Spring中存在的配置錯誤。 相對於基本的BeanFactory,ApplicationContext 惟一的不足是佔用內存空間。當應用程序配置Bean較多時,程序啓動較慢。spa

BeanFacotry延遲加載,若是Bean的某一個屬性沒有注入,BeanFacotry加載後,直至第一次使用調用getBean方法纔會拋出異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;因此一般狀況下咱們選擇使用 ApplicationContext。
應用上下文則會在上下文啓動後預載入全部的單實例Bean。經過預載入單實例bean ,確保當你須要的時候,你就不用等待,由於它們已經建立好了。code

2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但二者之間的區別是:BeanFactory須要手動註冊,而ApplicationContext則是自動註冊。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。並且 beanFactory 的許多功能須要經過編程實現而 Applicationcontext 能夠經過配置實現。好比後處理 bean , Applicationcontext 直接配置在配置文件便可而 beanFactory 這要在代碼中顯示的寫出來才能夠被容器識別。 )

3.beanFactory主要是面對與 spring 框架的基礎設施,面對 spring 本身。而 Applicationcontex 主要面對與 spring 使用的開發者。基本都會使用 Applicationcontex 並不是 beanFactory 。

4、總結

做用:
1. BeanFactory負責讀取bean配置文檔,管理bean的加載,實例化,維護bean之間的依賴關係,負責bean的聲明週期。

2. ApplicationContext除了提供上述BeanFactory所能提供的功能以外,還提供了更完整的框架功能:
a. 國際化支持
b. 資源訪問:Resource rs = ctx. getResource(「classpath:config.properties」), 「file:c:/config.properties」
c. 事件傳遞:經過實現ApplicationContextAware接口

3. 經常使用的獲取ApplicationContext

FileSystemXmlApplicationContext:從文件系統或者url指定的xml配置文件建立,參數爲配置文件名或文件名數組,有相對路徑與絕對路徑。

ApplicationContext factory=new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext factory=new FileSystemXmlApplicationContext("E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");複製代碼

ClassPathXmlApplicationContext:從classpath的xml配置文件建立,能夠從jar包中讀取配置文件。ClassPathXmlApplicationContext 編譯路徑總有三種方式:

ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); 
ApplicationContext factory = new ClassPathXmlApplicationContext("file:E:/Workspaces/MyEclipse 8.5/Hello/src/applicationContext.xml");複製代碼

XmlWebApplicationContext:從web應用的根目錄讀取配置文件,須要先在web.xml中配置,能夠配置監聽器或者servlet來實現

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>複製代碼

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>複製代碼

這兩種方式都默認配置文件爲web-inf/applicationContext.xml,也可以使用context-param指定配置文件

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>複製代碼
相關文章
相關標籤/搜索