Spring3.1.0实现原理分析(十八).MVC处理器和处理器适配器

       大家好,我们之前介绍过处理器映射,一个request请求对象经过处理器映射解析后可以获得执行链对象(若干个拦截器加一个处理器),处理器是用来返回应答数据的,而处理器适配器的作用是调用处理器。在spring mvc中默认的处理器映射是“ RequestMappingHandlerMapping”,其返回的处理器是“HandlerMethod”,驱动该处理器工作的处理器适配是“RequestMappingHandlerAdapter”。

一.HandlerMethod处理器

      理论上处理器可以有很多种实现方式,具体到HandlerMethod来说的话,它的实现方式调用某个对象的方法来处理器请求返回应答数据。下图是HandlerMethod处理器模块的类结构图,由三个类共同实现处理器的功能。

1. HandlerMethod (负责提供原材料)

a. 持有处理方法对象以及方法所属的对象。

b. 持有方法参数数组对象。

c. 持有bean工厂。

2. InvocableHandlerMethod(负责获取处理方法的实参数组)

a. 持有处理器方法参数解析器。

b. 实现了调用处理器方法对象的功能。

3. ServletInvocableHandlerMethod (负责解析方法返回值)

a. 持有处理器方法返回值解析器。

b. 实现了解析方法返回值的功能。

 

二. 处理器适配器

spring mvc内部有很多种适配器,因为每种适配器对应不同的处理器,今天我们只讲解负责调用HandlerMethod的适配器“RequestMappingHandlerAdapter”,下面是类结构图。

1.HandlerAdapter (该接口是整个结构的顶级接口,它定义了三个重要的方法)

a. 是否支持处理器:我们说过,处理器和适配器是对应的,就是通过这个方法实现,适配器是否支持驱动这种类型的处理器。

b. 调用处理器处理请求:这个就是核心方法了,调用处理器,返回应答数据,为什么说适配器的作用是驱动处理器,就是因为这个方法。

c. 获取资源最后修改时间:这个方法的作用是支持客户端缓存,不过RequestMappingHandlerAdapter为实现该功能,直接返回-1。

 

2. AbstractHandlerMethodAdapter

这个类在结构上实现了HandlerAdapter接口的三个方法,通过自身定义的三个抽象方法实现接口方法,因此它也并没有真正实现处理逻辑,我们可以看下RequestMappingHandlerAdapter三个抽象的声明,基本上跟HandlerAdapter接口的方法一一对应。

 

/**
 * 判断适配器是否支持HandlerMethod对象
 * 参数1:处理器方法对象
 */
protected abstract boolean supportsInternal(HandlerMethod handlerMethod);

/**
 * 使用HandlerMethod对象处理请求
 * 参数1:request
 * 参数2:response
 * 参数3:处理器方法对象
 */
protected abstract ModelAndView handleInternal(HttpServletRequest request,HttpServletResponse response,HandlerMethod handlerMethod) throws Exception;

/**
 * 获取资源最后修改时间(返回-1说明当前处理器不支持该功能)
 * 参数1:request
 * 参数2:处理器方法对象
 */
protected abstract long getLastModifiedInternal(HttpServletRequest request, HandlerMethod handlerMethod);

3. RequestMappingHandlerAdapter

这个类除了是AbstractHandlerMethodAdapter的派生类之外,还实现了BeanFactoryAware和InitializingBean接口。实现BeanFactoryAware接口是为了获取bean工厂,原因是某些方法参数值解析器需要使用bean工厂解析${...}和#{...}的功能。实现InitializingBean接口是为了获得初始化的机会,RequestMappingHandlerAdapter需要借这个机会初始化方法参数解析器和方法返回值解析器。下面我们具体讲解下它对超类三个抽象方法的实现逻辑。

a. 判断适配器是否支持HandlerMethod对象

是否支持解析方法的参数值和返回值。

b. 使用HandlerMethod对象处理请求

(1). 创建ModelAndViewContainer对象,并初始化ModelAndViewContainer的模型对象。默认从request的session中获取被@SessionAttributes注解的属性值(非覆盖),调用被@ModelAttribute注解的方法把返回值添加到容器(非覆盖),解析被@ModelAttribute注解的参数,同时该参数名称或类型被@SessionAttributes注解了,从session中获取参数值,把值添加到容器(非覆盖)。

(2). 执行请求处理方法对象并解析返回值。

(3). 创建ModelAndView对象,从ModelAndViewContainer获取视图和模型,赋值给ModelAndView。

c. 获取资源最后修改时间

RequestMappingHandlerAdapter直接返回-1,不支持该功能。

转载于:https://my.oschina.net/u/157224/blog/1492888

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值