詳解springmvc如何處理接受http請求
1. 背景
今天開了一篇文章“SpringMVC是如何將不同的Request路由到不同Controller中的?”;看完之后突然想到,在請求走到mvc 之前服務是怎么知道有請求進來了,并且知道交給誰處理呢?想看看這一塊的代碼
2. web項目和非web項目
當我們需要新增一個后端接口的時候,我們會通過@RestController和@RequestMapping注解來新增一個接口。然后我們發(fā)現(xiàn)我們這兩個注解實際上是在spring-web包下的。
- 如果我們的后端服務需要提供http請求的能力,那么我們就需要引入一個spring-web的包。稱做web項目。
- 如果我們的后端服務只提供thrift(一種rpc框架),那么我們也就不需要引入spring-web的包,稱做非web項目。 這次主要是想看看是怎么處理的http請求。
3. 環(huán)境準備
- 新建或者打開一個之前創(chuàng)建的springboot項目,我用的是之前寫各種demo的項目
- 在項目中新建一個Controller或者使用之前的Controller,我用的是之前就建好的TestController,自己得知道咋請求這個接口就行
@RestController
public class TestController implements BaseController {
@RequestMapping("/test")
public String test() {
return "SUCCESS";
}
}
- 在AbstractHandlerMethodMapping#lookupHandlerMethod第一行添加斷點(這個看文章知道的會在這里處理請求轉發(fā)到不同的controller),如圖

- 以debug啟動項目

- 請求接口,然后進入到debug模式
4. 分析鏈路
- 首先可以看到在線程池拿到了一個task并執(zhí)行

- 繼續(xù)往下,我們可以看到這個task是一個SocketProcessorBase對象,添加斷點,重啟服務,再次請求接口

- 然后發(fā)現(xiàn)是在NioEndpoint$Poller創(chuàng)建的socket繼續(xù)debug,


- 這個時候我們發(fā)現(xiàn),是在容器加載完成之后會去啟動服務,同時啟動tomcat

當tomcat接受到請求的時候:
- Poller從Acceptor線程接收新的連接請求。
- Poller將接收到的連接請求注冊到其內部的NIO Selector上。
- Poller不斷輪詢其注冊的Selector,以查看是否有任何NIO事件就緒。
- 一旦Poller檢測到某個通道上有事件就緒,它就會創(chuàng)建一個SocketProcessor任務對象,并將該任務提交給Executor線程池進行處理。
- 然后經(jīng)過tomcat 的一頓invoke

- 開始處理請求

- 一直走到FrameworkServlet這個springmvc處理請求的核心類 9. 然后走到DispatcherServlet 的doDispatch類
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
。。。省略
try {
//現(xiàn)在在這里,去拿mappedHandler
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
。。。省略
}
5. 總結
后面就走到了我們比較熟悉的springmvc處理請求的地方了,這塊網(wǎng)上很多寫的文章,大家感興趣可以自己去百度看看。
以上就是詳解springmvc如何處理接受http請求的詳細內容,更多關于springmvc處理http請求的資料請關注腳本之家其它相關文章!
相關文章
解決spring中redistemplate不能用通配符keys查出相應Key的問題
這篇文章主要介紹了解決spring中redistemplate不能用通配符keys查出相應Key的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
基于Springboot實現(xiàn)JWT認證的示例代碼
本文主要介紹了基于Springboot實現(xiàn)JWT認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Spring Boot集成MinIO進行文件存儲和管理的詳細步驟
這篇文章主要介紹了Spring Boot集成MinIO進行文件存儲和管理的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧2025-04-04

