详解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中String+String和String+char
这篇文章主要向大家详细区分了java中String+String和String+char,感兴趣的小伙伴们可以参考一下2016-01-01Java中@ConditionalOnProperty注解使用
在Spring Boot中,@ConditionalOnProperty注解是一种方便的工具,用于根据应用程序配置文件中的属性值来控制Bean的创建和加载,本文就来介绍一下Java中@ConditionalOnProperty注解使用,感兴趣的可以了解一下2023-11-11
最新评论