Spring容器

###BeanFactory BeanFactory是Spring框架最核心的接口,它提供IOC的配置機制,可是它沒法支持spring的許多插件,如AOP功能、Web應用等。 XMLBeanFactory是BeanFactory典型實現。 XMLBeanFactory類圖 注意:java

  1. 初始化BeanFactory時,必須提供日誌框架,在類路徑下提供Log4J配置文件。web

  2. BeanFactoroy採用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調用getBean()),纔對該Bean進行加載實例化,這樣,咱們就不能發現一些存在的Spring的配置問題。spring

###ApplicationContext applicationcontext類圖 ApplicationContext接口由BeanFactory接口派生而來,於是提供BeanFactory全部的功能。ApplicationContext以一種更向面向框架的方式工做以及對上下文進行分層和實現繼承,ApplicationContext包還提供瞭如下的功能: • MessageSource, 提供國際化的消息訪問
• 資源訪問,如URL和文件
• 事件傳播
• 載入多個(有繼承關係)上下文 ,使得每個上下文都專一於一個特定的層次,好比應用的web層編程

  1. 利用MessageSource進行國際化
    BeanFactory是不支持國際化功能的,由於BeanFactory沒有擴展Spring中MessageResource接口。相反,因爲ApplicationContext擴展了MessageResource接口,於是具備消息處理的能力(i18N),具體spring如何使用國際化,之後章節會詳細描述。緩存

  2. 強大的事件機制(Event)
    基本上牽涉到事件(Event)方面的設計,就離不開觀察者模式。 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接口。app

  1. 底層資源的訪問
    ApplicationContext擴展了ResourceLoader(資源加載器)接口,從而能夠用來加載多個Resource,而BeanFactory是沒有擴展ResourceLoader框架

  2. 對Web應用的支持
    與BeanFactory一般以編程的方式被建立不一樣的是,ApplicationContext能以聲明的方式建立,如使用ContextLoader。固然你也可使用ApplicationContext的實現之一來以編程的方式建立ApplicationContext實例 。 注意:webapp

  3. ApplicationContext則相反,它是在容器啓動時,一次性建立了全部的Bean。這樣,在容器啓動時,咱們就能夠發現Spring中存在的配置錯誤。this

  4. ApplicationContext繼承了ResourceLoader接口使得ApplicationContext能夠訪問到任何外部資源。

###WebApplicationContext webapplicationcontext類圖

  1. WebApplicationContext是專門爲Web應用準備的,它容許從相對於Web的根目錄的路徑裝載配置文件來完成初始化。從WebApplicationContext中能夠得到ServletContext引用,整個Web應用上下文對象講做爲屬性放置在ServletContext中,以便Web引用環境能夠訪問Spring的上下文。

  2. WebApplicationContext初始化 須要擁有Web容器的前提下才能夠啓動,啓動方式有在web.xml下配置自啓動的servlet(ContextLoaderServlet)或者定義Web容器監聽器(ContextLoaderListener); 。

這個listener須要檢查contextConfigLocation參數。若是不存在的話,它將默認使用/WEB-INF/applicationContext.xml。若是它存在,它就會用預先定義的分隔符(逗號,分號和空格)分開分割字符串,並將這些值做爲應用上下文將要搜索的位置。ContextLoaderServlet能夠用來替換ContextLoaderListener。這個servlet像listener那樣使用contextConfigLocation參數。

###Spring和SpringMVC父子容器

(1) 經過HierarchicalBeanFactory接口,Spring的IoC容器能夠創建父子層級關聯的容器體系,子容器能夠訪問父容器中的Bean,但父容器不能訪問子容器的Bean。在容器內,Bean的id必須是惟一的,但子容器能夠擁有一個和父容器id相同的Bean。父子容器層級體系加強了Spring容器架構的擴展性和靈活性,由於第三方能夠經過編程的方式,爲一個已經存在的容器添加一個或多個特殊用途的子容器,以提供一些額外的功能。

(2)Spring使用父子容器實現了不少功能,好比在Spring MVC中,展示層Bean位於一個子容器中,而業務層和持久層的Bean位於父容器中。這樣,展示層Bean就能夠引用業務層和持久層的Bean,而業務層和持久層的Bean則看不到展示層的Bean。

####代碼解讀

配置Spring容器

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>

//ContextLoaderListener中initWebApplicationContext()方法源碼片斷
//將Spring容器設置到servletContext
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);

//FrameWorkServlet中initWebApplicationContext()方法源碼片斷
ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;

cwac.setParent(rootContext);

//獲取rootContext
public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
	//從servletContext中得到Spring容器
	return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}
相關文章
相關標籤/搜索