千家信息网

HandlerAdapter适配器模式的源码分析

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇文章为大家展示了HandlerAdapter适配器模式的源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SpringMVC中的HandlerAdap
千家信息网最后更新 2025年12月02日HandlerAdapter适配器模式的源码分析

本篇文章为大家展示了HandlerAdapter适配器模式的源码分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

SpringMVC中的HandlerAdapter适配器

什么是适配器模式

定义:将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变得可以调用。

适配器模式应用场景

  • Mybatis多种日志框架的整合

  • SpringMVC适配器模式

  • 新老版本的兼容问题

SpringMVC适配器模式源码分析

1、通过URL找到具体的请求方法

mappedHandler = this.getHandler(processedRequest);

在这里进行初始化三个适配器

先走父类

返回true

protected boolean supportsInternal(HandlerMethod handlerMethod) {    return true;}

拿到对应的适配器

HandlerAdapter接口看下所有适配器类型

下面看下这几种适配器:

AbstractHandlerMethodAdapter implements HandlerAdapter

public final boolean supports(Object handler) {    return handler instanceof HandlerMethod && this.supportsInternal((HandlerMethod)handler);}

HttpRequestHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {    return handler instanceof HttpRequestHandler;}

RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter

protected boolean supportsInternal(HandlerMethod handlerMethod) {    return true;}

SimpleControllerHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {    return handler instanceof Controller;}

SimpleServletHandlerAdapter implements HandlerAdapter

public boolean supports(Object handler) {    return handler instanceof Servlet;}
  • 继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter

  • HTTP请求处理器适配器:HttpRequestHandlerAdapter

  • 注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter

如果不采用适配器的话

If(hanlder instanceof Controller){ // 执行Controller适配器}If(hanlder instanceof  HttpControler){ // 执行我们的HttpController}If(hanlder instanceof  ServletControler){ // 执行我们的HttpController}If(hanlder instanceof  AnnotationControler){ // 执行我们的AnnotationController}

简单实现接口

@Controller("/httpRequestHandler")public class ExtHttpRequestHandlerAdapter implements HttpRequestHandler {    @Override    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        System.out.println("httpRequestHandler");    }}

这个时候就会执行到HttpRequestHandlerAdapter适配器

模拟SpringMVC适配器模式

HandlerAdapter

public interface HandlerAdapter {    /**     * 根据hanlder判断是那个HandlerAdapter类型 如果找到对应的类型话返回true */    boolean supports(Object handler);    /**     * 执行我们的请求方法 */    void handle(Object handler);}

HandlerAdapter子类

public class AnnotationHandlerAdapter implements HandlerAdapter {    /**     * 注解形式的适配器 */    public boolean supports(Object handler) {        return (handler instanceof AnnotationController);    }    public void handle(Object handler) {        ((AnnotationController) handler).hanlder();    }}
public class HttpRequestHandlerAdapter implements HandlerAdapter {    /**     * Http类型 适配器 */    public boolean supports(Object handler) {        return (handler instanceof HttpController);    }    public void handle(Object handler) {        ((HttpController) handler).hanlder();    }}

Controller

public interface Controller {//请求方法void hanlder();}

Controller子类

public class AnnotationController implements Controller {    public void hanlder() {        System.out.println("AnnotationController");    }}
public class HttpController implements Controller {    public void hanlder() {        System.out.println("HttpController");    }}

DispatcherServlet

public class DispatcherServlet {    private List handlerAdapters;    public DispatcherServlet() {        handlerAdapters = new ArrayList();        handlerAdapters.add(new HttpRequestHandlerAdapter());        handlerAdapters.add(new AnnotationHandlerAdapter());    }    public void dispatcher() {        // 1. 已经获取到hanlderAnnotationController hanlder = new AnnotationController();    // 2.获取具体适配器HandlerAdapter handlerAdapter = getHandlerAdapter(hanlder);        // 3.执行我们的请求方案handlerAdapter.handle(hanlder);    }    public HandlerAdapter getHandlerAdapter(Controller controller) {        if (this.handlerAdapters != null) {            for (HandlerAdapter ha : this.handlerAdapters) {                if (ha.supports(controller)) {                    return ha;                }            }        }        return null;    }    public static void main(String[] args) {        new DispatcherServlet().dispatcher();    }}

上述内容就是HandlerAdapter适配器模式的源码分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

适配器 适配 模式 接口 类型 源码 分析 方法 内容 处理器 子类 形式 技能 方式 注解 知识 处理 简明 简明扼要 三个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全主题课堂设计 手游lol国际服对战服务器延迟 项目网络安全防范措施 在线代理服务器最干净 网络安全搜集哪些数据 数据库的简单查询实践报告 数据库链接下载zip 操作数据库的页面流程 怎样建立数据库服务器 linux链接mysql数据库 数据库读取的HTML没解析 云管理服务数据库运维技术方案 浩瀚星云网络技术有限公司待遇 我的世界官网查询手机版服务器 suma服务器安装centos web用哪种软件开发 园区网络部署是计算机网络技术吗 江西省银行网络安全 软件开发商务文件有哪些 计算机网络技术基础h 软件开发的研发费用比例 中国联通广东分公司软件开发 泰安联想服务器哪家是专业做的 淳化网络安全宣传 xx市网络安全工作规则 实现linux服务器互相通信 拳头平台无法连接服务器 安卓数据库增删改查卡顿 网络安全研究预期成果 网络安全界的3大公司
0