Spring學習筆記一: Bean工廠(BeanFactory )與應用上下文(ApplicationContext)BeanFactory

衣舞晨風發表於2016-07-14

bean工廠:最簡單的容器,提供了基礎的依賴注入支援。建立各種型別的Bean.
應用上下文(ApplicationContext):建立在bean工廠基礎之上,提供系統架構服務。

beans包提供了以程式設計的方式管理和操控bean的基本功能,而context包下的ApplicationContext以一種更加面向框架的方式增強了BeanFactory的功能。多數使用者可以採用宣告的方式來使用ApplicationContext,甚至不用手動建立它,而通過ContextLoader這樣的支援類,把它作為J2EE web應用的一部分自動啟動。當然,我們仍然可以採用程式設計的方式建立一個ApplicationContext。

context包的核心是ApplicationContext介面。它由BeanFactory介面派生而來,因而提供了BeanFactory所有的功能。 為了以一種更向面向框架的方式工作以及對上下文進行分層和實現繼承,context包還提供了以下的功能:
1、MessageSource, 提供國際化的訊息訪問
2、資源訪問,如URL和檔案
3、事件傳播,實現了ApplicationListener介面的bean
4、載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層

<bean scope=“singleton|prototype|request|session” /> 

singleton: 單例 預設值
prototype: 原型,表示每次獲得bean都會生成一個新的物件
request: 一次http請求有效( java web開發中)
session: session級有效,表示在一個使用者會話內有效(java web開發中)
globalSession:表示在全域性會話內有效

使用原型bean會對效能產生影響,儘量不要設定為prototype,除非有必要。

1、bean工廠介紹

工廠設計模式,建立分發各種bean。配置好它們之間的協作關係,參與bean的生命週期。

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

bean工廠只把bean的定義資訊載進來,用到的時候才例項化。
factory.getBean(“mybean”);就可得到一個bean。

2、使用應用上下文

ApplicationCotext, Spring更加高階的容器。
功能強大:

  • 提供文字資訊解析工具,包括對國際化支援。
  • 提供載入檔案資源的通用方法,如圖片。
  • 可以向註冊為監聽器的bean傳送事件。
    在很少的情況下,使用BeanFactory,如在移動裝置。

三種經常用到的實現:

  1. ClassPathXmlApplicationContext:從類路徑中載入。
  2. FileSystemXmlApplicationContext:從檔案系統載入。
  3. XmlWebApplicationContext:從web系統中載入。
ApplicationContext context = new FileSystemXmlApplicationContext("c:\foo.xml");
ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");

除了應用上下文提供的附加功能外,應用上下文與bean工廠的另一個重要區別是關於單例bean如何被載入。

BeanFactroy採用的是延遲載入形式來注入Bean的,即只有在使用到某個Bean時(呼叫getBean()),才對該Bean進行載入例項化,這樣,我們就不能發現一些存在的spring的配置問題。而ApplicationContext則相反,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤。

3、BeanFactory 還是 ApplicationContext?

簡單的說:除非你有更好的理由,否則儘量使用ApplicationContext,下面是對於哪些”為什麼”等等更深入的建議

ApplicationContext包含BeanFactory的所有功能。通常建議比BeanFactory優先,除非有一些限制的場合如位元組長度對記憶體有很大的影響時(Applet)。然後,絕大多數”典型的”企業應用和系統,ApplicationContext就是你需要使用的。Spring2.0及以上版本,大量使用了link linkend=”beans-factory-extension-bpp”>BeanPostProcessor擴充套件(以便應用代理等功能),如果你選擇BeanFactory則無法使用相當多的支援功能,如事務和AOP,這可能會導致混亂,因為配置並沒有錯誤。

下面的功能矩陣列出了BeanFactory提供的功能和ApplicationContext提供的功能(包括其實現)。
這裡寫圖片描述

更加詳細的資訊參考:
Spring-中文參考手冊


本文部分內容整理自網路
作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章