Spring BeanFactory和ApplicationContext

CodeWalker發表於2018-10-12

BeanFactory和ApplicationContext都可以用一bean的載入、例項化和維護,BeanFactorty介面提供了配置框架及基本功能,但是無法支援spring的aop功能和web應用。ApplicationContext介面作為BeanFactory的派生,因而提供BeanFactory所有的功能。而且ApplicationContext還在功能上做了擴充套件,相較於BeanFactorty,ApplicationContext還提供了以下的功能:

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

3. 常用的獲取ApplicationContext的方法:
FileSystemXmlApplicationContext:從檔案系統或者url指定的xml配置檔案建立,引數為配置檔名或檔名陣列
ClassPathXmlApplicationContext:從classpath的xml配置檔案建立,可以從jar包中讀取配置檔案

WebApplicationContextUtils:從web應用的根目錄讀取配置檔案,需要先在web.xml中配置,可以配置監聽器或者servlet來實現


以下通過宣告方式,即可使用ApplicationContext應用上下文載入bean,如果web.xml中不加如下監聽器也可以,只不過預設使用了BeanFactory作為bean工廠

Bean工廠載入bean之後不會馬上例項化,在bean第一次使用時才真正例項化,且例項化的bean都是單例的,而通過應用上下文載入的單例bean在載入的時候會立即初始化

複製程式碼
<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>複製程式碼


三、二者區別

1.BeanFactroy採用的是延遲載入形式來注入Bean的,即只有在使用到某個Bean時(呼叫getBean()),才對該Bean進行載入例項化,這樣,我們就不能發現一些存在的Spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤。 相對於基本的BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間。當應用程式配置Bean較多時,程式啟動較慢。

BeanFacotry延遲載入,如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用呼叫getBean方法才會丟擲異常;而ApplicationContext則在初始化自身是檢驗,這樣有利於檢查所依賴屬性是否注入;所以通常情況下我們選擇使用 ApplicationContext。
應用上下文則會在上下文啟動後預載入所有的單例項Bean。通過預載入單例項bean ,確保當你需要的時候,你就不用等待,因為它們已經建立好了。

2.BeanFactory和ApplicationContext都支援BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的許多功能需要通過程式設計實現而 Applicationcontext 可以通過配置實現。比如後處理 bean , Applicationcontext 直接配置在配置檔案即可而 beanFactory 這要在程式碼中顯示的寫出來才可以被容器識別。 )

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

四、總結

作用:
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>複製程式碼


相關文章