快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
ng[] getDefaultConfigLocations() {      if (getNamespace() != null) {        return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};      }      else {        return new String[] {DEFAULT_CONFIG_LOCATION};      }    } }

Spring源代码解析(二):IOC容器在web容器中的启动(2)

时间:2011-03-29 javaeye jiwenke

对于一个Spring激活的web应用程序,可以通过使用Spring代码声明式的指定在web应 用程序启动时载入应用程序上下文(WebApplicationContext),Spring的ContextLoader是 提供这样性能的类,我们可以使用 ContextLoaderServlet或者ContextLoaderListener的 启动时载入的Servlet来实例化Spring IOC容器 - 为什么会有两个不同的类来装载它呢, 这是因为它们的使用需要区别不同的Servlet容器支持的Serlvet版本。但不管是 ContextLoaderSevlet还是 ContextLoaderListener都使用ContextLoader来完成实际的 WebApplicationContext的初始化工作。这个ContextLoder就像是Spring Web应用程序在 Web容器中的加载器booter。当然这些Servlet的具体使用我们都要借助web容器中的部署 描述符来进行相关的定义。

下面我们使用ContextLoaderListener作为载入器作一个详细的分析,这个Servlet的 监听器是根上下文被载入的地方,也是整个 Spring web应用加载上下文的第一个地方; 从加载过程我们可以看到,首先从Servlet事件中得到ServletContext,然后可以读到配 置好的在web.xml的中的各个属性值,然后ContextLoder实例化WebApplicationContext并 完成其载入和初始化作为根上下文。当这个根上下文被载入后,它被绑定到web应用程序 的ServletContext上。任何需要访问该ApplicationContext的应用程序代码都可以从 WebApplicationContextUtils类的静态方法来得到:

代码

WebApplicationContext getWebApplicationContext(ServletContext sc)

以Tomcat作为Servlet容器为例,下面是具体的步骤:

1.Tomcat 启动时需要从web.xml中读取启动参数,在web.xml中我们需要对 ContextLoaderListener进行配置,对于在web应用启动入口是在ContextLoaderListener 中的初始化部分;从Spring MVC上看,实际上在web容器中维护了一系列的IOC容器,其中 在ContextLoader中载入的IOC容器作为根上下文而存在于 ServletContext中。

代码

//这里对根上下文进行初始化。 public void contextInitialized(ServletContextEvent event) {    //这里创建需要的ContextLoader    this.contextLoader = createContextLoader();    //这里使用ContextLoader对根上下文进行载入和初始化    this.contextLoader.initWebApplicationContext(event.getServletContext ()); }

通过ContextLoader建立起根上下文的过程,我们可以在ContextLoader中看到:

代码

public WebApplicationContext initWebApplicationContext(ServletContext servletContext)      throws IllegalStateException, BeansException {    //这里先看看是不是已经在ServletContext中存在上下文,如果有说明前面已经被 载入过,或者是配置文件有错误。    if (servletContext.getAttribute (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {    //直接抛出异常    .........    }    ...............    try {      // 这里载入根上下文的父上下文      ApplicationContext parent = loadParentContext(servletContext);      //这里创建根上下文作为整个应用的上下文同时把它存到ServletContext中 去,注意这里使用的ServletContext

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号