ServletContext與ApplicationContext


ServletContext,即Servlet環境對象或Servlet容器,包含從容器環境中獲得的初始化信息,其內提供的屬性和方法在同一web應用下的所有servelt中被使用。每一個web-app只能有一個ServeltContext,web-app可以是一個放置web application文件的文件夾,也可以是一個.war。

    ApplicationContext 是Spring的核心,Context我們通常解釋為上下文環境,我想用“容器”來表述它更容易理解一些,ApplicationContext則是“應 用的容器”了:P,Spring把Bean放在這個容器中,在需要的時候,用getBean方法取出,雖然我沒有看過這一部分的源代碼,但我想它應該是一 個類似Map的結構。
在Web應用中,我們會用到WebApplicationContext,WebApplicationContext繼 承自ApplicationContext,先讓我們看看在Web應用中,怎么初始化WebApplicationContext,在web.xml中定 義:

<context-param>      
<param-name>contextConfigLocation</param-name>      
<param-value>/WEB-INF/applicationContext.xml</param-value>      
</context-param>      
     
<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> 

 

可以看出,有兩種方法,一個是用ContextLoaderListener這個Listerner,另一個是ContextLoaderServlet這 個Servlet,這兩個方法都是在web應用啟動的時候來初始化WebApplicationContext,我個人認為Listerner要比 Servlet更好一些,因為Listerner監聽應用的啟動和結束,而Servlet得啟動要稍微延遲一些,如果在這時要做一些業務的操作,啟動的前 后順序是有影響的。

    那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?
以ContextLoaderListener為例,我們可以看到
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
 
    ContextLoader 是一個工具類,用來初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我們繼續追 蹤initWebApplicationContext這個方法(具體代碼我不貼出,大家可以看Spring中的源碼),我們發現,原來 ContextLoader是把WebApplicationContext(XmlWebApplicationContext是默認實現類)放在了 ServletContext中,ServletContext也是一個“容器”,也是一個類似Map的結構,而 WebApplicationContext在ServletContext中的KEY就是 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,我們如果要使用 WebApplicationContext則需要從ServletContext取出,Spring提供了一個 WebApplicationContextUtils類,可以方便的取出WebApplicationContext,只要把 ServletContext傳入就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM