快速业务通道

Spring源代码解析(四):Spring MVC - 编程入门网

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

Spring源代码解析(四):Spring MVC

时间:2011-03-29 javaeye jiwenke

下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可 以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析 DispatcherServlet入手:

代码

//这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各 个Spring MVC主要元素的初始化 protected void initFrameworkServlet() throws ServletException, BeansException {    initMultipartResolver();    initLocaleResolver();    initThemeResolver();    initHandlerMappings();    initHandlerAdapters();    initHandlerExceptionResolvers();    initRequestToViewNameTranslator();    initViewResolvers(); }

看到注解我们知道,这是DispatcherSerlvet的初始化过程,它是在 WebApplicationContext已经存在的情况下进行的,也就意味着在初始化它的时候,IOC容 器应该已经工作了,这也是我们在web.xml中配置Spring的时候,需要把 DispatcherServlet的 load-on-startup的属性配置为2的原因。

对于具体的初始化过程,很容易理解,我们拿initHandlerMappings()来看看:

代码

private void initHandlerMappings() throws BeansException {    if (this.detectAllHandlerMappings) {      // 这里找到所有在上下文中定义的HandlerMapping,同时把他们排序      // 因为在同一个上下文中可以有不止一个handlerMapping,所以我们把他们 都载入到一个链里进行维护和管理      Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors (          getWebApplicationContext(), HandlerMapping.class, true, false);      if (!matchingBeans.isEmpty()) {        this.handlerMappings = new ArrayList(matchingBeans.values ());        // 这里通过order属性来对handlerMapping来在list中排序        Collections.sort(this.handlerMappings, new OrderComparator ());      }    }    else {      try {        Object hm = getWebApplicationContext().getBean (HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);        this.handlerMappings = Collections.singletonList(hm);      }      catch (NoSuchBeanDefinitionException ex) {        // Ignore, we''ll add a default HandlerMapping later.      }    }    //如果在上下文中没有定义的话,那么我们使用默认的 BeanNameUrlHandlerMapping    if (this.handlerMappings == null) {      this.handlerMappings = getDefaultStrategies (HandlerMapping.class);    ........    } }

Spring源代码解析(四):Spring MVC(2)

时间:2011-03-29 javaeye jiwenke

怎样获得上下文环境,可以参见我们前面的对IOC容器在web环境中加载的分析。 DispatcherServlet把定义了的所有HandlerMapping都加载了放在一个List里待以后进行 使用,这个链的每一个元素都是一个handlerMapping的配置,而一般每一个 handlerMapping可以持有一系列从URL请求到 Spring Controller的映射,比如 SimpleUrl

HandlerMaaping中就定义了一个map来持有这一系列的映射关系。

DisptcherServlet通过HandlerMapping使得Web应用程序确定一个执行路径,就像我们 在HanderMapping中看到的那样,HandlerMapping只是一个借口:

代码

public interface HandlerMapping {   public static final String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE =          

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