3.完成对ContextLoaderListener的初始化以后, Tomcat开始初始化DispatchServlet ,- 还记得我们在web.xml中队载入次序进行了定义。DispatcherServlet会建立自己的 ApplicationContext,同时建立这个自己的上下文的时候会从ServletContext中得到根上 下文作为父上下文,然后再对自己的上下文进行初始化,并最后存到 ServletContext中去 供以后检索和使用。
可以从DispatchServlet的父类FrameworkServlet的代码中看到大致的初始化过程,整 个ApplicationContext的创建过程和ContextLoder创建的过程相类似:
代码
protected final void initServletBean() throws ServletException, BeansException {
.........
try {
//这里是对上下文的初始化过程。
this.webApplicationContext = initWebApplicationContext();
//在完成对上下文的初始化过程结束后,根据bean配置信息建立MVC框架的各 个主要元素
initFrameworkServlet();
}
........
}
对initWebApplicationContext()调用的代码如下:
代码
protected WebApplicationContext initWebApplicationContext() throws BeansException {
//这里调用WebApplicationContextUtils静态类来得到根上下文
WebApplicationContext parent = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
//创建当前DispatcherServlet的上下文,其上下文种类使用默认的在 FrameworkServlet定义好的:DEFAULT_CONTEXT_CLASS = XmlWebApplicationContext.class;
WebApplicationContext wac = createWebApplicationContext(parent);
........
if (isPublishContext()) {
//把当前建立的上下文存到ServletContext中去,注意使用的属性名是和当 前Servlet名相关的。
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
}
return wac;
}
其中我们看到调用了WebApplicationContextUtils的静态方法得到根 ApplicationContext:
代码
public static WebApplicationContext getWebApplicationContext (ServletContext sc) {
//很简单,直接从ServletContext中通过属性名得到根上下文
Object attr = sc.getAttribute (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
.......
return (WebApplicationContext) attr; }
然后创建DispatcherServlet自己的WebApplicationContext:
protected WebApplicationContext createWebApplicationContext (WebApplicationContext parent)
throws BeansException {
.......
//这里使用了BeanUtils直接得到WebApplicationContext,ContextClass是前 面定义好的DEFAULT_CONTEXT_CLASS =
//XmlWebApplicationContext.class;
ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(getContextClass());
//这里配置父上下文,就是在ContextLoader中建立的根上下文
wac.setParent(parent);
//保留ServletContext的引用和相关的配置信息。
wac.setServletContext(getServletContext());
wac.setServletConfig(getServletConfig());
wac.setNamespace(getNamespace());
//这里得到ApplicationContext配置文件的位置
if (getContextConfigLocation() != null) {
wac.setConfigLocations(
|