springmvc如何处理接受http请求

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,自己得知道咋请求这个接口就行
java 复制代码
@RestController
public class TestController implements BaseController {
    @RequestMapping("/test")
    public String test() {
        return "SUCCESS";
    }
}
  • 在AbstractHandlerMethodMapping#lookupHandlerMethod第一行添加断点(这个看文章知道的会在这里处理请求转发到不同的controller),如图
  • 以debug启动项目
  • 请求接口,然后进入到debug模式

4. 分析链路

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

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

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


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

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

7. 开始处理请求

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

java 复制代码
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    。。。省略
    try {

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

5. 总结

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

相关推荐
@小匠1 小时前
Spring Cache 多租户缓存隔离解决方案实践
java·spring·缓存
程序员码歌4 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
橙*^O^*安4 小时前
Go 语言基础:变量与常量
运维·开发语言·后端·golang·kubernetes
工程师小星星4 小时前
Golang语言的文件组织方式
开发语言·后端·golang
哈喽姥爷5 小时前
Spring Boot---自动配置原理和自定义Starter
java·spring boot·后端·自定义starter·自动配置原理
舒一笑7 小时前
为什么where=Version就是乐观锁了?
后端·mysql·程序员
GoGeekBaird7 小时前
关于垂类AI应用落地行业的方法论思考
后端·github·agent
小宁爱Python7 小时前
Django 基础入门:命令、结构与核心配置全解析
后端·python·django
你的人类朋友8 小时前
认识一下Bcrypt哈希算法
后端·安全·程序员
tangweiguo030519878 小时前
基于 Django 与 Bootstrap 构建的现代化设备管理平台
后端·django·bootstrap