1. 程式人生 > >ServletContext與ApplicationContext

ServletContext與ApplicationContext

可以看出,有兩種方法,一個是用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傳入就可以了。