zoukankan      html  css  js  c++  java
  • SpringMVC(关于HandlerMapping执行流程原理分析)

    请求过来先碰见中央调度器(前端调度器)

    //Determine handler for the current request; 对当前请求决定交给哪个handler, 当前请求地址过来

    处理器执行链处理请求,接着我们去找getHandler的实现

    hm是HandlerMapping对象,下图选定位置调用HandlerMapping的getHandler()方法通过请求找到Handler,但是返回值为HandlerExecutionChain(执行链)

    这个servlet所支持的处理器映射器的集合,这里有N个处理器映射器。hm就是指HandlerMapping ,下面的if中的代码是指记录日志,日志跟踪。HandlerMapping处理器映射器中有N个拦截器,处理客服端请求的处理器只有一个,就是handler处理器。

    getHandler我们跟进去,

    看过来的handler是不是执行链,要是就把handler强转成执行链,如果不是我new出一个执行链并且把handler给执行链。

    HandlerInterceptor是处理器的拦截器。而且不是一个是多个拦截器(this.adaptedInterceptors),然后做了一个操作。如果当期拦截器,是映射用的拦截器,就把他给强转成处理器映射器。

    然后做了一个匹配,和查找的路径做匹配。然后加到了执行链拦截器中。那么如果不是就直接用一个的参数来添加。所有可以看出HandlerExecutionChain中只包含一个handler。包含N个拦截器。在把这个对象返回给了中央调度器。

     HandlerMapping总结:

    DispatcherServlet

    --->doDispatcher()

    ---->getHandler(request):

    ---->HandlerExecutionChain

    ------> hm.getHandler(request)-----》方法体中

    ----->ExecutionChain executionChain = getHandlerExecutionChain(handler, request);

    ----->new HandlerExecutionChain(handler)

    ----->chain.addInterceptor(interceptor);

    HandlerMapping:处理器映射器
    作用:根据【请求】找到【处理器Handler】,但并不是简单的返回处理器,而是
    将处理器和拦截器封装,形成一个处理器执行链(HandlerExecuteChain)。

    4.DispatcherServlet 拿着执行链去寻找对应的处理器适配器(HandlerAdapter)
    为什么要引入适配器?
    因为处理器(Handler)有很多种,DispatcherServlet没办法统一管理,所以出现了适配器。

    让适配器统一处理Handler,而DispatcherServlet统一处理适配器。

    根据请求去找对应的handler

  • 相关阅读:
    SpringBoot-Mysql模板多数据源加载
    SpringCloud-动态配置变化监控-获取变化(支持Config、Nacos)
    SpringBoot-ElasticJob封装快速上手使用(分布式定时器)
    关键字(标签)提示组件——拼音、汉字混合搜索
    写一个高性能的敏感词检测组件
    一个文件搞定Asp.net core 3.1动态页面转静态页面
    浅谈C#在网络波动时防重复提交
    对RC4算法进行改写,新的加密算法RCX。
    【ToolGood.Words】之【StringSearch】字符串搜索——基于BFS算法
    万能解决方案之彻底解决macOS cocoapods环境的所有问题
  • 原文地址:https://www.cnblogs.com/WuXuanKun/p/6203975.html
Copyright © 2011-2022 走看看