互联网架构-SpringMVC源码深度解析-031:HandlerAdapter适配器模式源码分析

1 SpringMVC底层执行流程简单回顾

课题内容:

  1. 什么是适配器模式?应用场景有哪些?
  2. 为什么SpringMVC需要通过适配器执行hanlder
  3. SpringMVC适配器模式源码分析
  4. SpringMVC框架中如何自定义适配器

思考:SpringMVC中为什么需要使用适配器执行请求方法?需要使用handler(已获取)获取对应的适配器,然后再通过适配器执行请求方法?

2 HandlerAdapter适配器有那些分类

HandlerAdapter适配器分类
在这里插入图片描述
SpringMVC适配器模式源码分析

  1. 使用getHandlerAdapter获取对应的hanlder的具体HandlerAdapter
  2. HandlerAdapter接口有如下的子类处理请求适配器
    2.1 继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter
    2.2 HTTP请求处理器适配器:HttpRequestHandlerAdapter
    3.3 注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter

Handler有多种类型,循环判断类型找到具体的适配器,包装进行调用执行方法。

3 SpringMVC为什么要采用适配器模式

Handler有多种不同类型,如果不采用适配器的话:
If(hanlder instanceof Controller){
// 执行Controller适配器
}
If(hanlder instanceof HttpControler){
// 执行HttpController
}
If(hanlder instanceof ServletControler){
// 执行HttpController
}
If(hanlder instanceof AnnotationControler){
// 执行AnnotationController
}
扩展性差
SpringMVC通过使用适配器针对不同handler类型找到不同的适配器实现执行。

4 HandlerAdapter适配器源码分析

什么是适配器模式
将一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变得可以调用。
适配器模式应用场景

  1. Mybatis多种日志框架的整合
  2. SpringMVC适配器模式
  3. 新老版本的兼容问题

简单模拟springMVC适配器模式运用
Adapter

public interface HandlerAdapter {

    /**
     * 根据handler判断是哪个HandlerAdapter类型,如果找到对应类型返回true
     * @param handler
     * @return
     */
    boolean supports(Object handler);

    /**
     * 执行请求方法
     */
    void handle(Object handler);
}
public class AnnotationHandlerAdapter implements HandlerAdapter {

    /**
     * 注解形式的适配器
     *
     * @param handler
     * @return
     */
    public boolean supports(Object handler) {
        return (handler instanceof AnnotationController);
    }

    public void handle(Object handler) {
        ((AnnotationController) handler).handler();
    }
}
public class HttpRequestHandlerAdapter implements HandlerAdapter {

    /**
     * Http类型适配器
     *
     * @param handler
     * @return
     */
    public boolean supports(Object handler) {
        return (handler instanceof HttpController);
    }

    public void handle(Object handler) {
        ((HttpController) handler).handler();
    }
}

Handler

public interface Controller {
    void handler();
}
public class AnnotationController implements Controller {

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

    public void handler() {
        System.out.println("HttpController");
    }
}

5 手写HandlerAdapter适配器模式01

DispatcherServlet

public class DispatcherServlet {

    private List<HandlerAdapter> handlerAdapters;

    public DispatcherServlet(){
        handlerAdapters = new ArrayList<HandlerAdapter>();
        handlerAdapters.add(new AnnotationHandlerAdapter());
        handlerAdapters.add(new HttpRequestHandlerAdapter());
    }
    public void dispatcher(){
        // 1.已经获取到handler
        AnnotationController handler = new AnnotationController();
        // 2.获取具体的适配器
        HandlerAdapter handlerAdapter = getHandlerAdapter(handler);
        // 3.执行请求方案
        handlerAdapter.handle(handler);

    }

    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();
    }
}

运行结果:
在这里插入图片描述

6 手写HandlerAdapter适配器模式02

断点调试流程:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring MVC 是一个基于 Servlet API 构建的 Web 框架,它是 Spring Framework 的一部分,提供了 Model-View-Controller(MVC)架构模式的实现。Spring MVC 的核心思想是将应用程序的业务逻辑与视图分离,使应用程序更容易维护和扩展。 Spring MVC 的源码涉及到很多模块,比如 DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver 等等。下面我们从 DispatcherServlet 入手,深度解析 Spring MVC 的源码。 1. DispatcherServlet DispatcherServlet 是整个 Spring MVC 框架的核心,它是一个 Servlet,所有的请求都会经过它。DispatcherServlet 的主要作用是将请求分派给相应的 HandlerMapping,然后将处理结果返回给客户端。DispatcherServlet 在初始化时会加载一些配置文件,比如 applicationContext.xml、spring-mvc.xml 等等。这些配置文件中定义了 Spring MVC 的各个组件,包括 HandlerMapping、HandlerAdapter、ViewResolver 等等。 2. HandlerMapping HandlerMapping 用来映射请求到相应的处理器,它根据请求的 URL 和其他条件来确定最终的处理器。Spring MVC 中提供了多种 HandlerMapping 实现,比如 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、SimpleUrlHandlerMapping 等等。其中,RequestMappingHandlerMapping 是最常用的 HandlerMapping 实现,它会扫描应用程序中所有带有 @Controller 注解的类,并将其中所有带有 @RequestMapping 注解的方法注册为处理器。 3. HandlerAdapter HandlerAdapter 用来确定请求处理器的类型,并调用相应的方法来处理请求。Spring MVC 中提供了多种 HandlerAdapter 实现,比如 HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、AnnotationMethodHandlerAdapter 等等。其中,AnnotationMethodHandlerAdapter 是最常用的 HandlerAdapter 实现,它会根据方法的参数类型和返回值类型动态地确定请求处理器的类型,并调用相应的方法来处理请求。 4. ViewResolver ViewResolver 用来将逻辑视图名解析为实际的视图对象,它根据逻辑视图名和其他条件来确定最终的视图对象。Spring MVC 中提供了多种 ViewResolver 实现,比如 InternalResourceViewResolver、FreeMarkerViewResolver、VelocityViewResolver 等等。其中,InternalResourceViewResolver 是最常用的 ViewResolver 实现,它会将逻辑视图名解析为 JSP 文件名,并返回一个 InternalResourceView 对象。 5. ModelAndView ModelAndView 是 Spring MVC 中最常用的视图模型对象,它包含了视图名称和模型数据。在处理请求时,请求处理器将模型数据填充到 ModelAndView 对象中,并返回一个 ModelAndView 对象作为处理结果。DispatcherServlet 会将 ModelAndView 对象传递给 ViewResolver,ViewResolver 会使用视图名称和模型数据来渲染响应结果。 以上就是 Spring MVC 源码深度解析的简要介绍,需要注意的是,Spring MVC 的源码非常庞大,涉及到很多细节问题。如果需要深入研究 Spring MVC 的源码,需要花费大量的时间和精力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值