WebApplicationContext初始化

 ApplicationContext是Spring的核心,Context我們通常解釋爲上下文環境,我想用“容器”來表述它更容易理解一些,ApplicationContext則是“應用的容器”了;在Web應用中,我們會用到WebApplicationContext,WebApplicationContext繼承自ApplicationContext;WebApplicationContext的初始化方式和BeanFactory.ApplicationContext有所區別,因爲WebApplicationContext需要ServletContext實例,也就是說它必須擁有Web容器的前提下才能完成啓動的工作.有過Web開發經驗的讀者都知道可以在web.xml中配置自啓動的Servlet或定義Web容器監聽器(ServletContextListener),藉助着兩者中的任何一個,我們就可以啓動Spring Web應用上下文的工作.

Spring分別提供了用於啓動WebApplicationContext的Servlet和Web容器監聽器:

org.springframework.web.context.ContextLoaderServlet;

org.springframework.web.context.ContextLoaderListener.

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

配置例子如下:
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>

那麼在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傳入就可以了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章