Spring WebApplicationContext 介紹

俺就不起網名發表於2018-08-03

目錄

 

一、ServletContext介紹

二、Spring Web應用上下文配置

三、總結


一、ServletContext介紹

javaee標準規定了,servlet容器需要在應用專案啟動時,給應用專案初始化一個ServletContext作為公共環境容器存放公共資訊,ServletContext中的資訊都是由容器提供的。

在web專案中,web.xml檔案我們通常有如下配置:

<context-param>
   <param-name>key</param-name>
   <param-value>value123</param-value>
</context-param>
<listener> 
   <listener-class>com.brolanda.contextlistener.listener.ContextListenerTest</listener-class>
</listener>

ServletContextListener的實現類程式碼如下(即上面的listener實現類):

public class ContextListenerTest implements ServletContextListener {
	//容器啟動時執行該方法
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        String value = servletContext.getInitParameter("key");
        System.out.println(" ContextListenerTest contextInitialized , key value is " + value + " .......");
    }

    //容器結束時執行該方法
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println(" ContextListenerTest contextDestroyed ......");
    }
}

此時啟動Web容器,執行流程如下:

1、啟動一個WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml,讀兩個節點: <listener></listener> 和 <context-param></context-param>;
2、緊接著,容器建立一個ServletContext(上下文),在該應用內全域性共享;
3、容器將<context-param></context-param>轉化為鍵值對,並交給ServletContext;
4、容器建立<listener></listener>中的類例項,即建立監聽,該監聽器必須實現自ServletContextListener介面,如Log4jConfigListener,或者如上自定義實現類(如果不自定義實現,可以使用實現類ContextLoaderListener)
5、Web專案啟動中,在監聽類中ontextInitialized(ServletContextEvent event)初始化方法會被執行,在該方法中獲取到ServletContext和全域性引數;
6、得到這個context-param的值之後,你就可以做一些操作了。這個時候你的WEB專案還沒有完全啟動完成,這個動作會比所有的Servlet都要早。換句話說,這個時候,你對<context-param>中的鍵值做的操作,將在你的WEB專案完全啟動之前被執行。
7、Web專案結束時,監聽類中的contextDestroyed(ServletContextEvent event)方法會被執行;
簡單來說流程就是:1、讀配置檔案節點-->2、建立ServletContext-->3、設定引數到Context中-->4、監聽listener並執行初始化方法和銷燬方法。

二、Spring Web應用上下文配置

Spring分別提供了使用者啟動WebApplicationContext的Servlet和Web容器監聽器:
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.ContextLoaderServlet
所有版本的WEB容器都可以定義自啟動的Servlet,但只有2.3及以上的版本的WEB容器才支援Web容器監聽器,現在一般都使用Listener了。

spring為我們提供的IOC容器,需要我們指定容器的配置檔案,然後由該監聽器初始化並建立該容器。指定配置檔案的地址及檔名稱,一定要使用:contextConfigLocation作為引數名稱。如下:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

該監聽器,預設讀取/WEB-INF/下的applicationContext.xml檔案。但是通過context-param指定配置檔案路徑後,便會去你指定的路徑下讀取對應的配置檔案,並進行初始化。專案啟動時,便會執行類ContextLoaderListener的相關方法,建立WebApplicationContext(Web應用上下文)並以鍵值對形式存放與ServletContext中。

在web.xml中,可以配置多個Servlet,如下:

<servlet>
	<init-param>
        <param-name>param1</param-name>
        <param-value>avalible in servlet init()</param-value>
    </init-param>
    <servlet-name>ServletDemo</servlet-name>
	<servlet-class>demo.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

SpringIOC容器先根據監聽初始化WebApplicationContext,然後再初始化web.xml中其他配置的servlet,為其初始化自己的上下文資訊servletContext,並載入其設定的配置資訊和引數資訊到該上下文中,將WebApplicationContext設定為它的父容器。所以最後的關係是ServletContext包含了WebApplicationContext,WebApplicationContext包含了其他的Servlet上下文環境。如下圖:

對於作用範圍而言,在DispatcherServlet中可以引用由ContextLoaderListener所建立的ApplicationContext中的內容,而反過來不行。
當Spring在執行ApplicationContext的getBean時,如果在自己context中找不到對應的bean,則會在父ApplicationContext中去找。這也解釋了為什麼我們可以在DispatcherServlet中獲取到由ContextLoaderListener對應的ApplicationContext中的bean。

三、總結

1、servlet容器需要在應用專案啟動時,給應用專案初始化一個ServletContext作為公共環境容器存放公共資訊。
2、WebApplicationContext,是繼承於ApplicationContext的一個介面,擴充套件了ApplicationContext,是專門為Web應用準備的,它允許從相對於Web根目錄的路徑中裝載配置檔案完成初始化。
3、在非web應用下,Bean只有singleton和prototype兩種作用域,WebApplicaitonContext為Bean新增了三個新的作用域:request/session/global session。
4、Spring分別提供了使用者啟動WebApplicationContext的Servlet和Web容器監聽器(ContextLoaderServlet/ContextLoaderListener);
5、WebApplicationContext實現類:
5-1、XmlWebApplicationContext
採用xml配置,則Spring將使用XmlWebApplicationContext啟動Spring容器,即通過XML檔案為Spring容器提供Bean的配置資訊;
5-2、AnnotationConfigWebApplicationContext
如果使用@Configure的java類提供配置資訊,則需要在xml中進行相關配置,設定contextClass引數值為AnnotationConfigWebApplicationContext類,contextConfigLocation引數值則為使用了@Configure註解的類。ContextLoaderListener如果發現配置了contextClass引數,就是使用引數所指定的實現類初始化容器。ApplicationContext介面也有對應的實現類AnnotationConfigApplicationContext。

 

參考:https://www.cnblogs.com/brolanda/p/4265597.html

相關文章