SpringMVC源码分析之AbstractHandlerMethodMapping体系扩展

目录

 

前言:

一、AbstractHandlerMethodMapping体系概览

二、RequestMappingInfo

各种映射条件的初始化

RequestMappingInfo

三、RequestMappingHandlerMapping类

分析

        1、初始化相关的请求映射关系

2.1、afterPropertiesSet()方法

2.2、detectHandlerMethods方法

2.3、getMappingForMethod方法

2.4、根据请求获取Handler

3.1、getHandlerInternal()方法

3.2、lookupHandlerMethod方法

3.3、handleMatch方法

3.4、handleNoMatch方法


前言:

   我们在之前的博文 xxxx 中以AbstractHandlerMapping接口为主介绍了两大类型的AbstractUrlHandlerMapping返回类级别的Handler和AbstractHandlerMethodMapping返回method方法级别的Handler两大方面,但是根据前缀我们知道两个均为抽象类,下面我们针对AbstractHandlerMethodMapping其具体的子类实现进行介绍。本篇博spring版本为5.2.7.RELEASE。

一、AbstractHandlerMethodMapping体系概览

在重复一遍,见名知意,该类是一个基于url和Handler对象的抽象类,其对应的子类实现UML类图为
 

 

从UML类图中可以大概清楚,在其下主要有一个子类RequestMappingInfoHandlerMapping

同时该类下还有一个子类RequestMappingHandlerMapping,在前面的博文中我们知道AbstractHandlerMethodMapping类通过模板化的处理方式已经实现了将request请求获取到对应的HandlerMethod(也叫方法级别的handler处理对象)的主要过程,其实现了模板方法的getHandlerInternal主要是从mappingRegistry集合根据请求获取对应的method Handler对象。同时提供了对于mappingRegistry集合中初始化对应的url,mapping,handler等。为了保证理解的连贯性,我们会对图上的两个子孙类进行讲解,同时使用AbstractHandlerMethodMapping来贯穿始终。

二、RequestMappingInfo

各种映射条件的初始化

通过上面的处理器映射器的核心方法getHandler()我们知道可以根据url获取到对应的MethodHandler对象,前提是我们需要保存url和MethodHandler的映射关系,同时spring对其进行扩展不仅仅包含上面所说的映射关系,还包含了比如url和映射关系,name和MethodHandler关联关系等等,这个就是我们上篇博文提到的MappingRegistry 其提供了register方法存储我们上面提到的相关的映射关系,在其register方法中getDirectUrls方法中的getMappingPathPatterns(抽象方法子类实现根据映射关系获取对应的url相关信息)。我们需要先重点关注一下其AbstractHandlerMethodMapping的初始化方法中的核心方法processCandidateBean方法。该方法的主要作用是根据isHandler()方法(抽象方法子类实现) 判断容器中bean(String类型或者对象类型)是否符合作为Handler对象,符合的class对象中通过getMappingForMethod(抽象方法子类实现)获取符合条件的mthod和mapping最终存储在mappingRegistry中,同时其getHandlerInternal方法中的lookupHandlerMethod方法在根据请求获取对应的MethodHandler 对于最终存储的mappingRegistry没有对应的映射关系的时候需要会根据handleNoMatch(抽象方法子类实现)来处理没有匹配Handler的情况。

对上面乱七八糟废话的总结:AbstractHandlerMethodMapping类是我们开发常用的获取MethodHanlder对象的基础类,其已经完成了大部分springMVC映射器的核心功能即根据请求获取对应的方法级别的Handler对象。其子孙类对其部分抽象方法进行相关的重写以丰富其细节的处理。

 RequestMappingInfo

RequestMappingInfoHandlerMapping类的继承关系,其继承了名为RequestMappingInfo泛型对象AbstractHandlerMethodMapping类,关于AbstractHandlerMethodMapping类我们已经比较熟悉了,但是RequestMappingInfo是什么东西我们需要了解清楚,这个类还是对于我们了解RequestMappingInfoHandlerMapping还是比较重要的。

 

  RequestMappingInfo是springMVC抽象出来的一个请求匹配条件概念模型。接口RequestCondition是一个泛型接口。事实上,它的泛型参数T通常也会是一个RequestCondition对象。抽象基类实现AbstractRequestCondition框架对接口RequestCondition有一组具体实现类。对这些具体实现类的一些通用逻辑,比如equals,hashCode和toString,同时其有具体的子类(详情见表格),RequestConditionHolder:一个持有RequestCondition对象的类以及包含多个RequestConditionHolder的复合对象CompositeRequestCondition类和包含所有常见的子类,用于将@RequestMapping注解信息转换为具体RequestMappingInfo类。

实现类

简介

PatternsRequestCondition

路径匹配条件

RequestMethodsRequestCondition

请求方法匹配条件 匹配@RequestMapping的method参数

ParamsRequestCondition

请求参数匹配条件 匹配@RequestMapping的param参数

HeadersRequestCondition

头部信息匹配条件 匹配@RequestMapping的header参数

ConsumesRequestCondition

存储@RequestMapping注解中的consumes和headers中的

Content-Type。表明请求过来的时候需要按照这里指

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值