`

spring 源码 阅读 笔记 之 HandlerMapping

阅读更多
类图:


AbstractHandlerMapping.java : 支持Handler排序、默认的Handler以及Handler拦截器。
1. Handler排序:继承Ordered接口,每一个HanderMapping都有一个优先值(int order),默认的优先值为最大的优先值。
2. 拦截器:支持两种类型的拦截器(HandlerInterceptor和WebRequestInterceptor:二者的区别在于HandlerInterceptor处理的对象是标准的servlet请求和响应,而WebRequestInterceptor处理的对象是spring的WebRequest),所有的拦截器存放在:private HandlerInterceptor[] adaptedInterceptors;中。对于WebRequestInterceptor类型拦截器,通过WebRequestHandlerInterceptorAdapter适配器加入到数组中。
3. 本类getHandler()方法返回的是包含一系列Interceptor的HandlerExecutionChain,不是raw Handler。HandlerExecutionChain包装了raw Handler以及一系列Interceptor。
4. 本类继承WebApplicationObjectSupport是为了通过Bean name取得从spring上下文中取实际的bean(Object handler = getApplicationContext().getBean(handlerName))

AbstractUrlHandlerMapping.java:包含映射Handler到URLS的基础功能。支持直接映射("/test" "/test")和Ant-style映射("/t*""/test" 和 "/team"),对于每个请求会找到其最佳映射(最长匹配)。
1. private Object rootHandler:对应URL为”/”或null
2. private boolean lazyInitHandlers = false:对于单例类型的Handler,可以通过设置其lazy-init和此属性为true(缺一不可),实现lazily initialization。这是因为即使该bean的lazy-init属性设为true,但是在注册Handler时如果lazyInitHandlers为true,也会对该bean进行初始化:
       // Eagerly resolve handler if referencing singleton via name.
if (!this.lazyInitHandlers && handler instanceof String) {
String handlerName = (String) handler;
if (getApplicationContext().isSingleton(handlerName)) {
resolvedHandler = getApplicationContext().getBean(handlerName);
}
}
3. Ant-style匹配:

                //urlPath对应为request中的请求路径
                //handlerMap中保存了所有注册的匹配路径
String bestPathMatch = null;
for (Iterator it = this.handlerMap.keySet().iterator(); it.hasNext();) {
String registeredPath = (String) it.next();
if (getPathMatcher().match(registeredPath, urlPath) &&
(bestPathMatch == null || bestPathMatch.length() < registeredPath.length())) {
                                //遍历寻找到最长的匹配路径
bestPathMatch = registeredPath;
}
}
4. PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE:本方法会在raw Handler中增加一个拦截器:
HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler);
chain.addInterceptor(new PathExposingHandlerInterceptor(pathWithinMapping));
该拦截器是本方法的一个内部类:功能是在Handler执行前request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
pathWithinMapping的生成策略示例(三个参数依次对就为:注册的url匹配模式、请求的url路径、pathWithinMapping):
• '/docs/cvs/commit.html' and '/docs/cvs/commit.html -> ''
• '/docs/*' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/cvs/*.html' and '/docs/cvs/commit.html -> 'commit.html'
• '/docs/**' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/**\/*.html' and '/docs/cvs/commit.html -> 'cvs/commit.html'
• '/*.html' and '/docs/cvs/commit.html -> 'docs/cvs/commit.html'
• '*.html' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
• '*' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
5. 内部类的使用:本方法中有一个私有内部类:该类的使用条件:只在本方法中使用。
同时该内部类与其包含类之间存在调用关系。
  private class PathExposingHandlerInterceptor extends HandlerInterceptorAdapter {
private final String pathWithinMapping;
public PathExposingHandlerInterceptor(String pathWithinMapping) {
this.pathWithinMapping = pathWithinMapping;
}
public boolean preHandle(HttpServletRequest request,       HttpServletResponse response, Object handler) {
                        //调用其包含类中的方法
exposePathWithinMapping(this.pathWithinMapping, request);
return true;
}
}

AbstractDetectingUrlHandlerMapping.java:在上下文中寻找所有存在URL映射属性的Handler bean:
        1. private boolean detectHandlersInAncestorContexts = false:是否需要在其父应用上下文件中寻找Handler bean。
List urls = new ArrayList();
if (beanName.startsWith("/")) {
                        //bean的名称以”/”开始才会认为其映射到一个URL
urls.add(beanName);
}
String[] aliases = getApplicationContext().getAliases(beanName);
for (int i = 0; i < aliases.length; i++) {
if (aliases[i].startsWith("/")) {
                               //bean的别名以”/”开始才会认为其映射到一个URL
urls.add(aliases[i]);
}
}
                if (!ObjectUtils.isEmpty(urls)) {
      // 只有当urls不为空时,我们才会认为这是一个Handler
      registerHandler(urls, beanName);
        }
分享到:
评论

相关推荐

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    SpringMVC源码解读之HandlerMapping

    主要介绍了SpringMVC源码解读之HandlerMapping 的相关资料,需要的朋友可以参考下

    SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化

    主要介绍了SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化的相关资料,需要的朋友可以参考下

    SpringMVC源码总结(一)HandlerMapping和HandlerAdapter入门

    NULL 博文链接:https://yihuawuye1.iteye.com/blog/2104547

    Spring MVC 学习笔记

    2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...

    看透springMvc源代码分析与实践

    8.3 关联spring源代码87 8.4 小结89 第9章 创建Spring MVC之器90 9.1 整体结构介绍90 9.2 HttpServletBean93 9.3 FrameworkServlet95 9.4 DispatcherServlet100 9.5 小结107 第10章 Spring MVC之用108 10.1...

    SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发

    主要介绍了SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发 的相关资料,需要的朋友可以参考下

    spring:spring源码级别的学习

    spring 一、配置阶段 1、web.xml DispatcherServlet 由Spring提供的 2、init-param classpath:application.xml contextConfigLoation 3、url-pattern /* 二、初始化、启动阶段 1、init 加载spring的配置文件 2、IOC...

    spring1.0.zip

    闲来无事,手写Spring的mini版本 1.0, 目前只有几个核心功能, @Controller,@RequestMapping,@RequestParam,HandlerMapping,DispatchServlet等.但是从前端发起URL请求到后台可以处理结果并且返回, 实现了...

    民宿网站管理系统java+spring.7z,架构是SSM

    Spring MVC 内置了 Requestmapping、HandlerMapping 和 ViewResolver 等组件,可以简化开发流程。MyBatis 作为持久层框架,负责处理数据库操作。 在安全性方面,该网站采用了 SSL 证书进行加密传输,并实现了用户...

    Spring SpringMVC 简单整合

    Spring SpringMVC 简单整合(初学者参考) demo项目对应地址说明 :https://blog.csdn.net/tianyu00/article/details/89186404 SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 ...

    java spring mvc

    5)Spring MVC处理流程 a.首先客户端发出spring mvc请求,请求到达DispatcherServlet主控制器处理(前端控制器) b.主控制器调用HandlerMapping组件,根据请求不同调用Controller处理器 c.主控制器调用Controller方法...

    Spring in Action(第二版 中文高清版).part2

    第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...

    Spring in Action(第二版 中文高清版).part1

    第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...

    全面掌握Spring MVC:从基础到高级的实践指南

    Spring MVC是Spring框架的一个模块,专注于构建Web应用程序。作为架构师和Java开发者,深入理解Spring MVC的原理和实践应用是非常重要的。本文通过分析Spring MVC的核心组件和执行流程,提供了一个全面的学习指南。 ...

    Struts2+Spring3+MyBatis3完整实例

    org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,handlerMapping,handlerAdapter]; parent: org....

    基于spring+java的教务管理系统.7z,SSM框架

    Spring MVC 内置了 Requestmapping、HandlerMapping 和 ViewResolver 等组件,可以简化开发流程。MyBatis 作为持久层框架,负责处理数据库操作。 在安全性方面,该教务管理系统采用了 SSL 证书进行加密传输,并实现...

    Spring面试题

    2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个...

    spring-1.0.zip

    本文的目的是使用300行代码实现Spring MVC 核心原理,读取配置文件,实现自己的ioc容器,实现依赖注入,再根据注解和对应的方法实例化HandlerMapping,更重要的是为之后的源码的阅读提供一个大概的轮廓.

    Spring MVC运行流程

    Spring MVC运行流程,分七个步骤,1.DispatcherServlet 2.HandlerMapping

Global site tag (gtag.js) - Google Analytics