SpringMVC源码分析(7)剖析HandlerAdapter

SpringMVC中,和HandlerMapping一样重要的一个组件,就是HandlerAdapter。

如果说HandlerMapping是沟通请求和后端Controller的桥梁。HandlerAdapter则是负责具体处理请求核心工作了,另外一个处理请求的责任系列拦截器,前面已经说过了。

HandlerMapping和HandlerAdapter,看名字怎么都像弟兄俩。确实两者关系不一般,所有解析出的HandlerMapping,都统统适配一个合适的HandlerAdapter来负责具体处理事务。

作用

SimpleServletHandlerAdapter


处理Servlet 接口

默认不激活

SimpleControllerHandlerAdapter 处理 Controller接口
HttpRequestHandlerAdapter  处理HttpRequestHandler 接口
AnnotationMethodHandlerAdapter 处理 handler methods

1.HandlerAdapter 初始时机

1.AnnotationDrivenBeanDefinitionParser.parse(),注册了AnnotationMethodHandlerAdapter;

2.AbstractHttpRequestHandlerBeanDefinitionParser.registerHandlerAdapterIfNecessary()注册了HttpRequestHandlerAdapter;
3.ViewControllerBeanDefinitionParser.registerHanderAdapter注册了

SimpleControllerHandlerAdapter;

4.ComplexWebApplicationContext.refresh()注册了SimpleServletHandlerAdapter,默认不激活。

总结:HandlerAdapter是在解析标签时已经初始化完毕了。

介绍完了Adapter是如何初始化,初始化到容器中。接下来可以讨论内部实现原理了。

2.HandlerAdapter 工作原理

2.1 接口

public interface HandlerAdapter {
   
   /**
    * 判断是否支持Handler
    */
   boolean supports(Object handler); 
   
   /**
    * Use the given handler to handle this request.
    * The workflow that is required may vary widely.
    * 使用Handler处理请求
    */
   ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

   /**
    * Same contract as for HttpServlet‘
    */
   long getLastModified(HttpServletRequest request, Object handler);

}

2.2 AnnotationMethodHandlerAdapter介绍

AnnotationMethodHandlerAdapter是几个为数不多Handler中最重要的一个处理类。

通过它,可以将请求适配到匹配的某个Handler的具体方法上。

2.3 AnnotationMethodHandlerAdapter处理序列图

图画的感觉挺多,但总结起来,就做了两件事。

  1. 匹配寻找合适的方法
  2. 调用方法,构造mav视图

时间: 2024-08-07 04:20:57

SpringMVC源码分析(7)剖析HandlerAdapter的相关文章

SpringMVC源码分析(4)剖析DispatcherServlet重要组件

<SpringMVC源码分析(3)DispatcherServlet的请求处理流程 >简单介绍了一个请求的处理过程, 简略描述了调用过程,并没有涉及过多细节,如url匹配,报文解析转换等. <SpringMVC源码分析(2)DispatcherServlet的初始化>:介绍了servlet的初始化过程,尤其initStrategies方法. 本文主要总结DispatcherServlet几个重要组件的关系. 1.类图 该类图并没有全面的描述SpringMVC相关类,重点说明组件的关

SpringMVC源码分析(5)剖析重要组件HandlerMapping

<SpringMVC源码分析(4)剖析DispatcherServlet重要组件>   简要介绍了各个组件,从本章开始,针对各个组件,深入介绍.首先是HandlerMapping. HanlerMapping是沟通请求和后端controller映射,是所有请求的入口. 1.类结构介绍 该图只对属性和类层级进行了描述,屏蔽了方法,主要是为了根据内部属性,重点理解Spring HandlerMapping提供功能. 1.1 AbstractHandlerMapping HandlerMapping

SpringMVC源码分析(6)剖析DefaultAnnotationHandlerMapping

接<SpringMVC源码分析(5)剖析重要组件HandlerMapping>,继续剖析HandlerMapping,DefaultAnnotationHandlerMapping是SpringMVC 中最重要的HandlerMapping组件.虽然它在spring3.1版本后被废弃了. 包括2部分内容 DefaultAnnotationHandlerMapping剖析 HandlerMapping的拦截器 1.DefaultAnnotationHandlerMapping剖析 鉴于它的重要地

7、SpringMVC源码分析(2):分析HandlerAdapter.handle方法,了解handler方法的调用细节以及@ModelAttribute注解

从上一篇 SpringMVC源码分析(1) 中我们了解到在DispatcherServlet.doDispatch方法中会通过 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()) 这样的方式来执行request的handler方法. 先来分析一下ha.handle方法的调用过程:HandlerAdapter接口有一个抽象实现类AbstractHandlerMethodAdapter,在该抽象类中通过具体方法

SpringMVC源码分析(3)DispatcherServlet的请求处理流程

<SpringMVC源码分析(1)标签解析>:介绍了解析过程中,初始化若干组件. <SpringMVC源码分析(2)DispatcherServlet的初始化>:初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的过程. 概览 ①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件. ②:HanlerMappi

8、SpringMVC源码分析(3):分析ModelAndView的形成过程

首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception方法开始,看看这个牛逼的ModelAndView是怎么开始的,又是怎么结束的: 1 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Except

SpringMVC源码分析(2)DispatcherServlet的初始化

DispatcherServlet的初始化,是在org.springframework.web.context.ContextLoaderListener完成加载后,才开始的.这时候WebApplicationContext(包含DAO,Service等)已经初始完毕. DispatcherServlet的初始过程主要完成 1.WebApplicationContext父子容器维护 2.初始化Servlet策略 本文主要内容 DispatcherServlet的集成体系 DispatcherSe

springmvc源码分析系列-请求处理流程

接上一篇-springmvc源码分析开头片 上一节主要说了一下springmvc与struts2的作为MVC中的C(controller)控制层的一些区别及两者在作为控制层方面的一些优缺点.今天就结合下面的一张图和上一篇中关于springmvc各个模块之间及各个模块中的类的继承关系的一张图对springmvc的请求处理流程进行一个分析.当然有了springmvc的请求处理流程我们就知道了springmvc是如何在启动的时候去加载或者去解析对应的具体控制器,以及modleAndView使干什么用的

【转】springmvc源码分析链接

SpringMVC源码 SpringMVC源码分析系列 说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而 springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟 悉. 一进Spring的官网就发现了这样一排醒目的文字, spring可以让我们构造简单的.便携的.又快又易于扩展的基于jvm的系统和应用程序. 没错,基于Spr

SpringMVC源码分析系列

说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟悉. 一进Spring的官网就发现了这样一排醒目的文字, spring可以让我们构造简单的.便携的.又快又易于扩展的基于jvm的系统和应用程序. 没错,基于Spring的MVC框架SpringMVC同样也可以构造具有这些特