【Spring】springmvc如何处理接受http请求

news2025/1/17 19:54:28

目录

​编辑

1. 背景

2. web项目和非web项目

3. 环境准备

4. 分析链路

5. 总结


1. 背景

今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的?”;看完之后突然想到,在请求走到mvc 之前服务是怎么知道有请求进来了,并且知道交给谁处理呢?想看看这一块的代码

2. web项目和非web项目

当我们需要新增一个后端接口的时候,我们会通过@RestController和@RequestMapping注解来新增一个接口。然后我们发现我们这两个注解实际上是在spring-web包下的。

  • 如果我们的后端服务需要提供http请求的能力,那么我们就需要引入一个spring-web的包。称做web项目。
  • 如果我们的后端服务只提供thrift(一种rpc框架),那么我们也就不需要引入spring-web的包,称做非web项目。 这次主要是想看看是怎么处理的http请求。

3. 环境准备

  • 新建或者打开一个之前创建的springboot项目,我用的是之前写各种demo的项目
  • 在项目中新建一个Controller或者使用之前的Controller,我用的是之前就建好的TestController,自己得知道咋请求这个接口就行
@RestController
public class TestController implements BaseController {
    @RequestMapping("/test")
    public String test() {
        return "SUCCESS";
    }
}

 

  • 在AbstractHandlerMethodMapping#lookupHandlerMethod第一行添加断点(这个看文章知道的会在这里处理请求转发到不同的controller),如图

    image-1.png

  • 以debug启动项目

image-2.png

  • 请求接口,然后进入到debug模式

4. 分析链路

  1. 首先可以看到在线程池拿到了一个task并执行

image-3.png

2. 继续往下,我们可以看到这个task是一个SocketProcessorBase对象,添加断点,重启服务,再次请求接口

image-4.png

3. 然后发现是在NioEndpoint$Poller创建的socket继续debug,

image-5.png

image-6.png

  1. 这个时候我们发现,是在容器加载完成之后会去启动服务,同时启动tomcat

image-7.png

5. 当tomcat接受到请求的时候:

  • Poller从Acceptor线程接收新的连接请求。
  • Poller将接收到的连接请求注册到其内部的NIO Selector上。
  • Poller不断轮询其注册的Selector,以查看是否有任何NIO事件就绪。
  • 一旦Poller检测到某个通道上有事件就绪,它就会创建一个SocketProcessor任务对象,并将该任务提交给Executor线程池进行处理。
  1. 然后经过tomcat 的一顿invoke

image-8.png

7. 开始处理请求

image-9.png

8. 一直走到FrameworkServlet这个springmvc处理请求的核心类 9. 然后走到DispatcherServlet 的doDispatch类

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    。。。省略
    try {

            //现在在这里,去拿mappedHandler
            mappedHandler = getHandler(processedRequest);
            if (mappedHandler == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
    。。。省略
}

 

5. 总结

后面就走到了我们比较熟悉的springmvc处理请求的地方了,这块网上很多写的文章,大家感兴趣可以自己去百度看看。

 

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

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

相关文章

[BUUTF]-PWN:wdb2018_guess解析

查看保护 查看ida 这道题并不复杂,只是要注意一点细节 完整exp: from pwn import* from LibcSearcher import* pprocess(./guess) premote(node5.buuoj.cn,28068) puts_got0x602020payloadba*0x128p64(puts_got) p.sendlineafter(bPlease type your gu…

基于语义解析的知识图谱问答系统

目录 前言1 背景介绍2 语义解析的核心技术2.1 自然语言处理(NLP)2.2 语义表示学习2.3 实体关系抽取 3 语义解析的基本步骤3.1 短语检测3.2 资源映射3.3 语义组合3.4 逻辑表达式生成 4 处理与知识图谱无关的问句4.1 Bridging技术4.2 确定谓词4.3 Paraphra…

杨中科 配置系统

1、配置系统入门 说明 1、传统Web.config配置的缺点,之前DI讲到过 2、为了兼容,仍然可以使用Web.config和ConfigurationManager类,但不推荐。 3、.NET 中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变…

Redis保证数据不丢失的手段

Redis 保证数据不丢失的主要手段有两个: 持久化集群运行 我们分别来看它们两的具体实现细节。 # 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中(如硬盘)的过程,以便在程序重启或者系统崩溃等情况下&#xf…

1898_野火FreeRTOS教程阅读笔记_链表操作

1898_野火FreeRTOS教程阅读笔记_链表操作 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 新的节点的插入,影响到的是链表中最后一个元素的后继以及当前被插入元素的前驱、后继以及归属属性。具体的操作效果为:新的节点更新自己的前…

101. 对称二叉树 - 力扣(LeetCode)

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 题目示例 输入:root [1,2,2,3,4,4,3] 输出:true 解题思路 首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点! 对于…

SAP-PS-001-006问题预算占用与订单实际金额不一致

前言 PS模块最复杂的业务场景主要就是ETO(Engineering-To-Order),也就是边设计边生产边采购的三边业务。 意味着从前端设计开始的成本就已经要进行收集,其次对于大型非标设备的生产发货只是一个环节,发货后还会涉及到现…

Java项目maven打包的包名设置(finalname标签的使用)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

年-月-日的输入方法

大家对于输入的函数一定有所认识&#xff0c;比如c中位于 #include <iostream> 中的 cin 函数&#xff0c;这个函数输入单个十分好用&#xff0c;但是对于年月日这种较为复杂的就行不通了&#xff0c;就只能输入最前面的一个 那怎么输入像这样的年月日呢 答案就是用 scan…

JVM-双亲委派机制

双亲委派机制定义 双亲委派机制指的是&#xff1a;当一个类加载器接收到加载类的任务时&#xff0c;会自底向上查找是否加载过&#xff0c; 再由顶向下进行加载。 详细流程 每个类加载器都有一个父类加载器。父类加载器的关系如下&#xff0c;启动类加载器没有父类加载器&am…

C++2024寒假J312实战班2.6

错题列表&#xff1a; #1Playlist #2分数线划定 #3Made Up #4图书管理员 #1Playlist 我们来介绍滑动窗口的写法&#xff1a; 1、使用一个滑动窗口k[l,r)在歌曲列表中移动。 2、同时利用一个unordered_set S来检测窗口中的歌曲是否有重复。如果窗口右端的歌曲在窗口内没有重复…

LLM应用开发与落地:流式响应

一、背景 最近智能客服产品给到一个游戏客户那边&#xff0c;客户那边的客服负责人体验后认为我们产品回答的准确率是还是比较高的。同时&#xff0c;他反馈了几个需要改进的地方&#xff0c;其中一个就是机器人回复慢。机器人回复慢有很多原因&#xff0c;也有优化方式&#…

2019 年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书(笔记详解)

1. 网络拓扑图 2. IP 地址规划表 3. 设备初始化信息 阶段一 任务 1:网络平台搭建 1、根据网络拓扑图所示,按照 IP 地址参数表,对 DCFW 的名称、各接口IP 地址进行配置。 2、根据网络拓扑图所示,按照 IP 地址参数表,对 DCRS 的名称进行配置,创建 VLAN 并将相应接口划入 …

C#,雷卡曼数(Recamán Number)的算法与源代码

1 雷卡曼数&#xff08;Recamn Number&#xff09; 雷卡曼数&#xff08;Recamn Number&#xff09;&#xff0c;即Recaman序列被定义如下&#xff1a; (1) a[0]0; (2) 如果a[m-1]-m>0并且这个值在序列中不存在&#xff0c;则a[m]a[m-1]-m; (3) 否则a[m]a[m-1]m; 雷卡曼序…

[UI5 常用控件] 08.Wizard,NavContainer

文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard&#xff1a;complete1.2.2 Wizard&#xff1a;finishButtonText1.2.3 Wizard&#xff1a;currentStep1.2.4 Wizard&#xff1a;backgroundDesign1.2.5 Wizard&#xff1a;enableBranching1.2.6 WizardStep&#xff1a;…

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置&#xff0c;希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了&#xff0c;在底行模式下set nu可以显示行号。今天补充一条&#xff1a;set nonu可以取消行号。这两条命令大家看看就可…

LeetCode-第28题-找出字符串中第一个匹配项的下标

1.题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …

SpringBoot源码解读与原理分析(二十)IOC容器的刷新(一)

文章目录 7 IOC容器的刷新7.1 初始化前的预处理7.1.1 初始化属性配置7.1.2 初始化早期事件的集合 7.2 初始化BeanFactory7.2.1 注解驱动的refreshBeanFactory7.2.2 XML驱动的refreshBeanFactory7.2.3 获取BeanFactory 7.3 BeanFactory的预处理配置7.3.1 ApplicationContextAwar…

自然语言学习nlp 六

https://www.bilibili.com/video/BV1UG411p7zv?p118 Delta Tuning&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;和机器学习领域中&#xff0c;通常指的是对预训练模型进行微调的一种策略。这种策略不是直接更新整个预训练模型的权重&#xff0c;而是仅针对模型…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息&#xff0c;统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…