DispatcherServlet doDispatch()方法解析(1)

news2024/12/23 9:37:30

目录

  • 简介
  • doDispatch() 源码解析
  • this.mappingRegistry

简介

在DispatcherServlet类中, 最关键的就是doDispatch()这个方法, 每一次请求都需要经过这个方法, 对每个请求进行转发, 通过反射调用对应的方法

doDispatch() 源码解析

在这里插入图片描述
可以看到最关键的代码就是1047行, 根据请求对象, 获取到对应handler处理链(HandlerExecutionChain对象), 这里需要注意的是返回的不是一个handler, 而是一个链, 里面包含了请求对应的过滤器集合, 进入方法看一下
在这里插入图片描述
可以看到, 有如歌handlermapping(在初始化时候添加到集合里面的), 根据不同类型的handlermapping获取HandlerExecutionChain, 这里我们只是普通请求, 使用的就是第一个RequestMappingHandlerMapping, 进入方法查看
在这里插入图片描述
继续进入
在这里插入图片描述
可以看到, 最关键的代码就是这一个方法了, 首先用initLookupPath方法获取到请求的地址, 之后再379行根据地址, 获取到对应的HandlerMethod对象, 进入379行
在这里插入图片描述
399行: 根据url, 获取到对应的集合, 集合里面对应的类型是RequestMappingInfo类型, 在这里this.mappingRegistry这个对象非常关键, 所有的映射关系都存在这个对象里面, 后面会说一下这个对应的初始化流程
400-402行 : 过滤上面集合里面的RequestMappingInfo对象, 存到matches集合中
407行 : 匹配唯一的Match对象
435行 : 获取对应的HandlerMehtod
到此我们就获取到了这个请求对应的处理器, 之后还需要获取该处理器对应的拦截器链路,即可
在这里插入图片描述
516行就是获取拦截器链路, 就不具体展开了 源码非常简单, 自己查看

this.mappingRegistry

接下来具体说一下this.mappingRegistry这个对象, 我们刚才有说这个对象包含所有的映射关系, 让我们来看一下他是如何初始化的
在这里插入图片描述
MappingRegistry类是AbstractHandlerMethodMapping类的一个内部类, 它里面最关键的数据包括两个

pathLookup : 是一个map, key是请求路径, value是一个requestMappingInfo对象
registry : 是一个map, key是requestMappingInfo对象, value是MappingRegistration对象, MappingRegistration里面包含HandlerMethod属性

在这里插入图片描述
可以看到,AbstractHandlerMethodMapping 类实现了InitializingBean接口, 这时候我们需要看具体的实现方法afterPropertiesSet()
在这里插入图片描述
可以猜测, 初始化就是在这个方法中完成的, 进入
在这里插入图片描述
222行遍历所有的bean,去执行224行的代码, 进入
在这里插入图片描述
只有265行有具体的操作, 看一下什么样的bean才满足264行的条件
在这里插入图片描述
类上必须有Controller注解获取RequestMapping注解才可以
返回到上一级, 进入到265行, 看一下进行了哪些操作
在这里插入图片描述
280-289行 : 根据类的全限定名, 获取类下的带有RequestMapping注解的方法存入到一个map, key : Method对象, value : RequestMappingInfo对象
298行 : 将map里面的信息赋值到MappingRegistry类中
在这里插入图片描述

下一篇再继续解析获取到处理器链路之后, doDispatch()这个方法还进行了哪些操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python规范

PEP8 风格指南: 缩进,用 4 个空格,不要用制表符。(Python 不允许混合制表符和空格进行缩进。)换行,一行不超过 79 个字符。用空行分隔函数和类,及函数内较大的代码块。 用两个空行包围顶级函数和类定义。类内的方法定…

算法通关村第十关 | 数组中第k个最大元素

1.数组中第k大的数字 题目: LeetCode:数组中的第k个最大元素,给定整数数组nums和整数k,请返回数组中第k个最大的元素,请注意,你需要找的是数组排序后第k个最大的元素,而不是第k个不同的元素。 运…

【【STM32-SPI通信协议】】

STM32-SPI通信协议 STM32-SPI通信协议 •SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线 •四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO…

stm32F103R6实现流水灯参考源代码

#include "main.h" #include "gpio.h" void SystemClock_Config(void); void sleep(int a) {int i0,j0;for(i0;i<a;i){for(j0;j<2000;j);}} 真正发挥效果的是这个main函数// int main(void) {int i0;HAL_Init();SystemClock_Config();MX_GPIO_Init()…

4.UE数字人工程运行逻辑及程序逻辑

1.Fay-UE5数字人工程导入 2.UE数字人语音交互 3.UE基本操作及数字人工程模块组成&#xff08;UE数字人系统教程&#xff09; 一、3个状态&#xff1a;鸡汤广告、交互&#xff08;聊天与否&#xff09;、跳舞 1、启动即开始循环鸡汤广告模式 2、第一次交互&#xff08;助理版…

gromacs教程练习1

gromacs能在win上运行&#xff0c;还是个开源的软件&#xff0c;这都很值得入手学习 记录下gromacs教程的练习情况&#xff1a; Lysozyme in water 水中的溶菌酶&#xff0c;嗯&#xff0c;估计就是把蛋白处理后放在显试溶剂里跑MD这个模拟。 1、文件的准备&#xff1a; 1、…

JVM虚拟机:初始化的介绍

本文重点 我们前面学习了三个步骤: 装载 连接 初始化 初始化 初始化的时候,会为静态成员变量赋值初始值,它有两种方式: ①声明类变量是指定初始值 ②使用静态代码块为类变量指定初始值 例子 最后输出的结果为3,它的过程是这样的: main方法中输出T.count,由于count是…

产品经理如何提高用户画像效果?SIKT模型

产品经理做用户画像&#xff0c;最担心被业务方反馈&#xff1a;没效果。这往往是由用户画像与业务场景脱节造成的。那么我们该如何从业务场景出发&#xff0c;让用户画像更有效&#xff1f;一般来说&#xff0c;我们可以采用SIKT模型解决这个问题。 用户画像 ​ 1、SIK…

使用CLI添加磁盘到VM

登录 https://portal.azure.com/#home&#xff0c;点击右上角的控制台图标 &#xff0c;打开CLI 在控制台中输入如下指令&#xff0c;在NetworkWatcherRG创建一个名字为TEST的虚拟机&#xff0c;使用的镜像是Win2019datacenter&#xff0c;username是aaa,password是1234567890A…

SpringBoot 操作Redis、创建Redis文件夹、遍历Redis文件夹

文章目录 前言依赖连接 RedisRedis 配置文件Redis 工具类操作 Redis创建 Redis 文件夹查询数据遍历 Redis 文件夹 前言 Redis 是一种高性能的键值存储数据库&#xff0c;支持网络、可基于内存亦可持久化的日志型&#xff0c;而 Spring Boot 是一个简化了开发过程的 Java 框架。…

JDBC Vertica Source Connector 使用文档

支持以下引擎 Spark Flink SeaTunnel Zeta 关键特性 批处理 精确一次性处理 列投影 并行处理 支持用户自定义拆分 支持查询 SQL 并实现投影效果 描述 通过 JDBC 读取外部数据源数据。 支持的数据源信息 DatasourceSupported versionsDriverUrlMavenVerticaDifferent depen…

SAP和APS系统超级BOM核对(SAP配置BOM攻略八)

2023年是华为自动驾驶上路元年&#xff0c;8月问界M5的自驾版已经开通了第一批五大城市的自动驾驶功能&#xff0c;年底逐步开放的城市会多达60个。问界M9会也会在年底发布&#xff0c;而M9的生产工厂也在紧锣密鼓的建设中。 APS (Advanced Planning Scheduling) 高级计划与排…

SD WebUI 扩展:prompt-all-in-one

sd-webui-prompt-all-in-one 是一个基于 Stable Diffusion WebUI 的扩展&#xff0c;旨在提高提示词/反向提示词输入框的使用体验。它拥有更直观、强大的输入界面功能&#xff0c;它提供了自动翻译、历史记录和收藏等功能&#xff0c;它支持多种语言&#xff0c;满足不同用户的…

【自用】云服务器 docker 环境下 HomeAssistant 安装 HACS 教程

一、进入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 连接上云服务器&#xff08;宿主机&#xff09;后&#xff0c;终端内进入 root &#xff0c;输入&#xff1a; docker ps找到了 docker 的 container ID 2.config HomeAssistant 输入下面的命令&…

1 树 1.1 树的基本概念 1.1.1 什么是树&#xff1f; 树是n(n > 0)个结点的有限集。当n 0时&#xff0c;称为空树。在任意一颗非空树上应该满足&#xff1a; 有且仅有一个特定的称为根的结点当n>1时&#xff0c;其余结点可分为m&#xff08;m>0&#xff09;个互不相…

webrtc学习(六)重要信令级时序图

一.四个重要信令 1.用户登录信令 SignIn 2..用户登出信令 SignOut 3..用户等待信令 wait信令是指从服务器的消息队列中获取暂存的中转消息&#xff0c;比如说sdp消息&#xff0c;对于信令服务器来说&#xff0c;他没有办法给用户推送消息&#xff0c;只能是用户推送消息给…

Leetcode151 翻转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…

元素在div中水平居中

先看一下行级元素在div中水平居中&#xff1b; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>div demo </title> <style> body {background-color:#d0e4fe; }</style> </head><body>&…

Python基础语法入门(第二十一天)——异常处理

在Python中&#xff0c;异常处理是一种机制&#xff0c;用于捕获和处理在程序执行过程中发生的错误。 Python中的异常处理可以使用try-except语句块来实现。try语句块可能包含可能出现错误的代码段&#xff0c;而except语句块包含处理错误的代码段。当try语句块中的代码发生错…

【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类

tomcat仿写 项目结构扫描文件servlet注解map容器servlet工具类启动类调用 项目结构 扫描文件之前当然要确定一下项目结构了&#xff0c;我这里的方案是tomcat和项目同级 项目的话就仿照我们平时使用的结构就好了&#xff0c;我们规定所有的静态资源文件都在webApp目录下存放…