Spring MVC : HandlerMapping 和 HandlerAdapter 简介 : 概念和如何工作

Spring MVC 中最核心的工作组件应该是其前端控制器DispatcherServlet了。而DispatcherServlet的工作,又建立在Spring MVC的9大策略组件之上。可以将Spring MVC想象成一个团队:DispatcherServlet是团队负责人,而9大策略组件可以被想象成9个队员,分别负责某一部分的职责,这样整个团队在DispatcherServlet的领导和协调下紧密配合,一起处理来自客户端的每个请求。

Spring MVC 的9大策略组件分别是 :

  • MultipartResolver
  • LocaleResolver
  • ThemeResolver
  • HandlerMapping
  • HandlerAdapter
  • HandlerExceptionResolver
  • RequestToViewNameTranslator
  • ViewResolver
  • FlashMapManager

而这9大策略组件中,最重要的应该就是HandlerMappingHandlerAdapter了。

HandlerMapping抽象了请求URL到请求处理器之间的映射,而HandlerAdapter用于封装对请求处理器的真正调用。打个比方讲,当某个客户请求到达时,DispatcherServlet会询问HandlerMapping哪个请求处理器能处理,然后找到支持该请求处理器的HandlerAdapter,然后将该请求处理器的调用交给该HandlerAdapter完成。这个例子简单地描述了DispatcherServlet处理请求工作的主流程,可以看出,DispatcherServlet所做的事情很简单,可以认为仅仅是一个主流程,而无需关心底层细节。而这里面很重要的两个底层细节: 请求到请求处理器的映射关系,请求处理器如何处理请求的具体逻辑,都不是DispatcherServlet关注点,相反,HandlerMappingHandlerAdapter这两个队员承担了处理这些底层细节的角色,而且它们之间的分工很明确,可以协调配合却又不重叠。

不难看出,这正是软件开发中非常重要的架构设计原则的应用:“关注点分离"和"单一职责”。其实Spring MVC的其它7大策略组件也是应用这些架构设计原则的产物。通过应用这些架构原则,原本可能很复杂的一个Spring MVC概念,就被分解成各个相对简单的各个组件了。

框架实现层面,HandlerMappingHandlerAdapter首先是两个接口定义,如下所示。

  • HandlerMapping 接口
package org.springframework.web.servlet;

public interface HandlerMapping {
    // 找到跟指定请求对应的请求处理器,封装为一个HandlerExecutionChain返回
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
  • HandlerAdapter 接口
package org.springframework.web.servlet;

public interface HandlerAdapter {
    // 当前请求处理器适配器是否支持指定的请求处理器handler
    boolean supports(Object handler);
    // 针对给定的请求/响应对象request/response调用给定的请求处理器handler,
    // 这里的handler一定符合条件 : this.supports(handler)==true
    ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception;
    // 跟 HttpServlet 定义的getLastModified语义相同
    long getLastModified(HttpServletRequest request, Object handler);
}

另外Spring MVC框架自身提供了一些HandlerMappingHandlerAdapter的实现类。这些实现类基本上能满足开发人员所有的各种请求/请求处理器的映射需求,一般无需开发人员另外提供自定义实现。

  • 框架自身提供的HandlerMapping实现类
HandlerMapping实现类请求处理器类型介绍
RequestMappingHandlerMappingHandlerMethod负责所有@RequestMapping注解的控制器方法,映射关系 : url pattern => HandlerMethod
SimpleUrlHandlerMappingHttpRequestHandler/Controller负责设置进来映射关系:url pattern => HttpRequestHandler/Controller实例
BeanNameUrlHandlerMappingController负责检测所有实现了接口Controllerbean: 每个这样的控制器类其实只有一个请求处理方法,映射关系 : url pattern => Controller bean
  • 框架自身提供的HandleAdapter实现类
HandleAdapter实现类请求处理器类型介绍
RequestMappingHandlerAdapterHandlerMethod每个HandlerMethod对应一个@RequestMapping注解的控制器方法
HttpRequestHandlerAdapterHttpRequestHandlerHttpRequestHandler的例子比如静态资源请求处理器ResourceHttpRequestHandler,一般通过ResourceHandlerRegistry程序化配置进来
SimpleControllerHandlerAdapterController请求处理器是实现了接口Controller的某个对象

应用配置时,开发人员需要配置不同类型和目的的HandlerMapping/HandlerAdapter组件。可能通过属性文件,可能通过注解,也可能是通过代码直接配置。

当然,如果是基于Spring bootSpring MVC应用,框架提供了缺省的配置,如无额外需求,开发人员无需另外配置。

应用启动时,各种配置会被汇集起来,构建HandlerMappingHandlerAdapter的组件bean并注册到容器,这些组件bean会基于HandlerMappingHandlerAdapter的实现类。并最终会被DispatcherServlet引用。

应用运行时,正如上面DispatcherServlet主流程所描述的,HandlerMappingHandlerAdapter组件bean在相应的环节被应用起来协调完成整个请求的处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值