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

- 以debug啟動(dòng)項(xiàng)目

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

- 繼續(xù)往下,我們可以看到這個(gè)task是一個(gè)SocketProcessorBase對(duì)象,添加斷點(diǎn),重啟服務(wù),再次請(qǐng)求接口

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


- 這個(gè)時(shí)候我們發(fā)現(xiàn),是在容器加載完成之后會(huì)去啟動(dòng)服務(wù),同時(shí)啟動(dòng)tomcat

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

- 開(kāi)始處理請(qǐng)求

- 一直走到FrameworkServlet這個(gè)springmvc處理請(qǐng)求的核心類(lèi) 9. 然后走到DispatcherServlet 的doDispatch類(lèi)
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
。。。省略
try {
//現(xiàn)在在這里,去拿mappedHandler
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
。。。省略
}
5. 總結(jié)
后面就走到了我們比較熟悉的springmvc處理請(qǐng)求的地方了,這塊網(wǎng)上很多寫(xiě)的文章,大家感興趣可以自己去百度看看。
以上就是詳解springmvc如何處理接受http請(qǐng)求的詳細(xì)內(nèi)容,更多關(guān)于springmvc處理http請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類(lèi)
這篇文章主要為大家介紹了groovy腳本定義結(jié)構(gòu)表一鍵生成POJO類(lèi)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問(wèn)題
這篇文章主要介紹了解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
基于Springboot實(shí)現(xiàn)JWT認(rèn)證的示例代碼
本文主要介紹了基于Springboot實(shí)現(xiàn)JWT認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Spring Boot集成MinIO進(jìn)行文件存儲(chǔ)和管理的詳細(xì)步驟
這篇文章主要介紹了Spring Boot集成MinIO進(jìn)行文件存儲(chǔ)和管理的詳細(xì)步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
Java實(shí)現(xiàn)汽車(chē)租賃系統(tǒng)
SpringBoot整合Scala構(gòu)建Web服務(wù)的方法

