Spring源码分析之HandlerAdapter体系解读

本文深入探讨了Spring MVC中的HandlerAdapter机制,从handlerAdapter的简介、体系结构,到AbstractHandlerMethodAdapter和RequestMappingHandlerAdapter的详细分析。重点解析了handleInternal方法,包括请求参数解析、业务逻辑执行和响应处理。同时介绍了相关知识点,如@InitBinder、@ModelAttribute、ResponseBodyAdvice、@SessionAttributes和@ControllerAdviceBean的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、handlerAdapter类

1、handlerAdapter简介

   在前面我们已经分析了通过HandlerMapping(处理器映射器)将请求映射到了对应的Handler上,下面就需要考虑如何解析并执行该handler对象,这里HandlerAdapter(处理器适配器)就登场了,我直接解析调用handler不就行了为啥还要使用HandlerAdapter包装一层呢?在之前的分析中我们了解到了两种类型的handler对象。

 (1)以实现了Controller接口的Handler类

public class DemoController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("进入DemoController方法执行处理逻辑");
        return new ModelAndView("demo");
    }
}

(2)以@RequestMapping注解修饰的HandlerMethod对象

@RequestMapping(value = "/book/ListPage",method = RequestMethod.POST)
@ResponseBody
public String getBookPage(@RequestBody BookQuery bookQuery){
       return success(pageTotal(pageInfo));
}

(3)其他类型Handler对象

    其他还有实现Servlet的实例,HandlerFunction实例、HttpRequestHandler实例等,不同的实例对象调用时走不同的方法,为了能将不同的方法转换成统一的调用形式,这里使用了适配器模式,将各个实例的方法调用包装到HandlerAdapter统一调用。

 

2、HandlerAdapter的体系结构

     HandlerAdapter是一个顶层接口,其提供如下三个方法

supports(Object handler)

该方法判断该适配器类是否支持解析调用Handler对象,因为Adapter被设计成了一个只适配执行某一种类型比如Controller接口类型或@RequestMapping类型的Handler需要使用SimpleControllerHandlerAdapter来进行处理,该方法在执行handler()方法之前需要使用该方法来判断是否支持调用这种类型的Handler对象。

handle(req,rep,handler)

解析并调用Handler对象的方法执行业务逻辑,从request请求中获取参数,执行handler并将响应结果放入reponse对象

getLastModified

获取请求的资源的最终修改时间,如果请求的资源未被修改则直接使用浏览器缓存,这个方法主要是针对http请求为get/head请求为提高性能的缓存处理。

 通过HandlerAdapter的UML类图我们可以看到该接口的继承关系比较简单,其提供了若干个分别对应上述不同Handler实例的适配器对象实现,由于@RequestMapping修饰的方法一个普通的方法因此比较复杂这里提供了一AbstractHandlerMethodAdapter简单抽象和继承前者的RequestMappingHandlerAdapter子类来处@RequestMapping修饰的普通方法的调用。

 

类实例

功能描述

SimpleControllerHandlerAdapter

用于处理实现Controller接口的实现类,调用其handleRequest方法处理请求

HandlerFunctionAdapter

用于处理实现HandlerFunction接口的实现类,调用其handle方法处理请求

HttpRequestHandlerAdapter

用于处理实现HttpRequestHandler接口的实现类,调用其handleRequest方法处理请求

SimpleServletHandlerAdapter

用于处理实现Servlet接口的实现类,调用其service方法处理请求

AbstractHandlerMethodAdapter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值