快速业务通道

Spring源代码解析(二):IOC容器在web容器中的启动 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18

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(       

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号