详解springmvc如何处理接受http请求

 更新时间:2024年02月10日 09:26:27   作者:喜欢小钱钱  
这篇文章主要给大家介绍了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,自己得知道咋请求这个接口就行
@RestController
public class TestController implements BaseController {
    @RequestMapping("/test")
    public String test() {
        return "SUCCESS";
    }
}
  • 在AbstractHandlerMethodMapping#lookupHandlerMethod第一行添加断点(这个看文章知道的会在这里处理请求转发到不同的controller),如图

  • 以debug启动项目

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

4. 分析链路

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

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

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

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

当tomcat接受到请求的时候:

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

  • 开始处理请求

  •  一直走到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处理请求的地方了,这块网上很多写的文章,大家感兴趣可以自己去百度看看。

以上就是详解springmvc如何处理接受http请求的详细内容,更多关于springmvc处理http请求的资料请关注脚本之家其它相关文章!

相关文章

  • java协程框架quasar和kotlin中的协程对比分析

    java协程框架quasar和kotlin中的协程对比分析

    这篇文章主要为大家介绍了java协程框架quasar和kotlin两个协程对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多基本
    2022-02-02
  • MyBatis与Spring中的SqlSession详解

    MyBatis与Spring中的SqlSession详解

    在MyBatis中,你可以使用SqlSessionFactory来创建SqlSession,使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory了,接下来通过示例代码讲解MyBatis与Spring中的SqlSession,需要的朋友可以参考下
    2024-05-05
  • JDK版本管理工具jEnv解决不同jdk版本项目

    JDK版本管理工具jEnv解决不同jdk版本项目

    本文主要介绍了JDK版本管理工具jEnv解决不同jdk版本项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Spring Boot 开发环境热部署详细教程

    Spring Boot 开发环境热部署详细教程

    这篇文章主要介绍了Spring Boot 开发环境热部署,本文给大家介绍了Spring Boot 开发环境热部署的原理及快速配置方法,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Redis中4种延时队列实现方式小结

    Redis中4种延时队列实现方式小结

    Redis作为高性能的内存数据库,具备原子操作、数据结构丰富和简单易用的特性,本文将介绍基于Redis实现分布式延时队列的四种方式,大家可以根据需要进行选择
    2025-04-04
  • SpringBoot-JWT生成Token和拦截器的使用(访问受限资源)

    SpringBoot-JWT生成Token和拦截器的使用(访问受限资源)

    本文主要介绍了SpringBoot-JWT生成Token和拦截器的使用(访问受限资源),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • SpringBoot集成 JWT实现用户登录认证的项目实践

    SpringBoot集成 JWT实现用户登录认证的项目实践

    当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,本文主要介绍了SpringBoot集成 JWT实现用户登录认证的项目实践,感兴趣的可以了解一下
    2023-08-08
  • 定时任务注解@Scheduled不生效问题及解决

    定时任务注解@Scheduled不生效问题及解决

    这篇文章主要介绍了定时任务注解@Scheduled不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • SpringBoot集成kaptcha验证码

    SpringBoot集成kaptcha验证码

    这篇文章主要为大家详细介绍了SpringBoot集成kaptcha验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 关于Spring中@Value注解使用和源码分析

    关于Spring中@Value注解使用和源码分析

    通过深入分析@Value注解的使用和源码,本文详细解释了Spring如何解析@Value注解并为属性赋值,首先,Spring会解析并收集所有被@Value注解修饰的属性,这一过程依赖于AutowiredAnnotationBeanPostProcessor类
    2024-11-11

最新评论