深入剖析Spring Boot中Spring MVC的請求處理流程

對于任何使用Spring Boot進行Web開發的開發者而言,深入理解Spring MVC的執行流程都是至關重要的。

這不僅有助于我們編寫更清晰、更高效的代碼,更是我們排查詭異問題、進行高級定制開發的知識基石。

今天,我們將一起深入Spring Boot應用的內核,揭開Spring MVC處理HTTP請求的神秘面紗。

一、核心設計:前端控制器模式

Spring MVC的核心架構基于前端控制器模式(Front Controller Pattern)。該模式的核心思想是:用一個中央控制器來統一接收所有請求,并將其分發給相應的處理組件

在Spring MVC中,這個中央控制器就是 DispatcherServlet。它是由Spring Boot通過自動配置(WebMvcAutoConfiguration)自動注冊的,默認映射路徑為 /,這意味著它成為了你應用處理所有Web請求的單一入口總調度中心

整個流程可以概括為:請求 -> DispatcherServlet -> 查找處理器 -> 執行處理器 -> 處理結果 -> 響應 。下面我們來分解這個過程的每一個細節。

二、詳細執行流程“八步走”

假設用戶發起了一個獲取用戶信息的請求:GET http://localhost:8080/api/users/1

其處理流程如下圖所示,你可以結合下文步驟來理解:

第1步:請求抵達 DispatcherServlet

所有HTTP請求首先都會被 DispatcherServlet 接收。它是整個流程的“大腦”,負責協調后續的所有工作。

第2步:HandlerMapping 尋找處理器

DispatcherServlet 本身不處理業務邏輯,它的首要任務是問詢一個或多個 HandlerMapping 組件:“這個請求應該由誰來處理?”。

HandlerMapping 會根據請求的URL(如 /api/users/1),在注冊的所有控制器中查找匹配的@RequestMapping方法。找到后,它會返回一個 HandlerExecutionChain 對象。這個對象不僅包含了目標處理器(即我們@Controller中的方法),還包含了配置好的攔截器HandlerInterceptor 列表。

第3步:執行攔截器(Interceptor)的 preHandle

在真正執行業務邏輯之前,DispatcherServlet 會按順序執行 HandlerExecutionChain 中所有攔截器的 preHandle 方法。

攔截器在這里可以進行權限校驗、日志記錄、參數預處理等。如果某個攔截器認為請求不合法(如用戶未登錄),它的 preHandle 方法會返回 false,從而直接中斷流程,跳轉到最后一步。

第4步:HandlerAdapter 適配并執行處理器

不同的處理器可能有不同的執行方式(例如普通的@Controller和舊的Controller接口)。DispatcherServlet 需要找到一個能“駕馭”當前處理器的 HandlerAdapter。最常用的是 RequestMappingHandlerAdapter

HandlerAdapter 是真正的“執行指揮官”,它負責:

  1. 數據綁定:將請求參數、URL路徑變量、Session屬性等綁定到處理器方法的參數上。我們常用的 @RequestParam@PathVariable@RequestBody 等都是在這一步生效的。
  2. 數據驗證:如果參數標注了 @Valid@Validated,會在此觸發校驗框架。
  3. 調用方法:最終通過反射機制,調用我們的控制器方法(如 UserController.getUserById(id)),并獲取其返回值。

第5步:處理器處理業務并返回

我們的控制器方法開始執行業務邏輯(如調用Service層查詢用戶數據),然后返回一個結果。這個結果通常有兩種形式:

  • 視圖名(String):例如返回 "userInfo",表示需要渲染一個視圖。
  • 數據對象(Object):例如返回一個User對象,這在@RestController中非常常見。

第6步:處理返回結果

這是流程的分水嶺,DispatcherServlet 會根據返回結果的類型選擇不同的處理策略:

  • 返回視圖名?交給 ViewResolver

ViewResolver(視圖解析器)會將邏輯視圖名(如"userInfo")解析為一個具體的View對象(如對應/templates/userInfo.html的ThymeleafView)。后續View對象會負責將模型數據渲染到HTML模板中,生成最終頁面。

  • 返回對象?交給 HttpMessageConverter

如果方法或類上有@ResponseBody注解(@RestController默認包含),DispatcherServlet會遍歷配置的HttpMessageConverter(消息轉換器)列表,選擇一個合適的轉換器(如MappingJackson2HttpMessageConverter),將返回的Java對象序列化為JSON、XML等格式,并直接寫入HTTP響應體

第7 & 8 步:攔截器收尾與響應返回

  • 執行 postHandle:控制器方法執行后(但在視圖渲染 ),攔截器鏈會按逆序執行postHandle方法,允許對模型數據進行最后修改。
  • 執行 afterCompletion:在整個請求處理完成(無論成功或異常)后,攔截器鏈會執行afterCompletion方法,用于進行資源清理工作(如關閉連接)。
  • 最終,生成的響應(HTML頁面或JSON數據)通過DispatcherServlet返回給客戶端瀏覽器。

三、不可或缺的異常處理機制

上述流程是“理想路徑”。如果任何步驟拋出異常,流程會立即中斷,并被 DispatcherServlet 捕獲。

此時,DispatcherServlet 會轉而委托 HandlerExceptionResolver 組件鏈來處理異常。這是我們實現統一異常處理的基礎:

  • ExceptionHandlerExceptionResolver:支持我們使用@ControllerAdvice@ExceptionHandler注解來全局處理異常。
  • ResponseStatusExceptionResolver:處理標注了@ResponseStatus的異常。
  • DefaultHandlerExceptionResolver:處理Spring內置的一些標準異常(如405 Method Not Allowed)。

異常解析器會將異常轉換為一個友好的錯誤響應(如一個JSON錯誤信息),從而替代正常的流程結果。

總結

Spring MVC的流程清晰而模塊化,每個組件各司其職:

  • DispatcherServlet 是協調全局的大腦
  • HandlerMapping 是負責尋路的地圖
  • HandlerAdapter 是真正干活的雙手
  • ViewResolver & HttpMessageConverter 是包裝成果的化妝師
  • HandlerInterceptor 是流程上的安檢員
  • HandlerExceptionResolver 是兜底的消防員

Spring Boot的自動配置魔法讓我們無需手動組裝這些零件,但理解它們如何協同工作,無疑會讓你從一個Spring Boot的使用者,蛻變成為一個真正的架構理解者。希望這篇剖析能幫助你更好地駕馭Spring Boot Web開發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98348.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

X448 算法簽名驗簽流程深度解析及代碼示例

一、引言:X448 算法的定位與價值在橢圓曲線密碼學(ECC)體系中,X448 是基于蒙哥馬利曲線(Curve448)的密鑰交換算法,但其底層數學原理也可支撐簽名驗簽功能(實際工程中常與 Ed448 簽名…

2025-2026單片機物聯網畢業設計題目推薦(定稿付款)

51.基于單片機的非接觸式防疫自動門系(1)人員檢測:利用超聲波模塊進行人員檢測,檢測到人員靠近門體時觸發相應的操作;(2)門控制:通過舵機實現自動門的開閉控制,當檢測到有…

一文詳解大模型強化學習(RLHF)算法:PPO、DPO、GRPO、ORPO、KTO、GSPO

一、 引言 大模型強化學習的核心目標是讓模型的輸出與人類目標、真實場景需求對齊。在工作和學習中,大模型強化學習訓練經常會遇到各種算法,各種O,在強化學習訓練選型過程中經常容易混淆,也分不清各種訓練算法的使用場景和優缺點。…

C++ 常見面試題匯總

基礎知識 一、C 基礎語法C 和 C 的區別? C 支持面向對象(封裝、繼承、多態)。C 引入模板、STL、異常處理。值傳遞、指針傳遞、引用傳遞的區別? 值傳遞:拷貝一份副本。指針傳遞:傳地址,可修改原數…

ES06-SpringData集成

ES06-SpringData集成 文章目錄ES06-SpringData集成1-參考網址2-知識整理3-Spring Data Elasticsearch 9.0.0 完整示例4-知識補充1-Elasticsearch JAVA操作有三種客戶端:1. TransportClient(已廢棄)2. JestClient(第三方 HTTP 客戶端&#xff…

對于鏈表相關經典算法題:環形鏈表的約瑟夫問題的解析

開篇介紹: Hello 大家,在上一篇博客中,我們一同拆解了「206. 反轉鏈表」和「876. 鏈表的中間結點」這兩道單鏈表經典題目,通過對指針操作的細致打磨,相信大家對單鏈表的特性與算法設計思路有了更深入的理解。而在今天…

MySQL集群——主從復制

目錄 一、環境搭建、部署 1. RHEL7.9、9.3的搭建 二、主從復制 1. 環境說明 2. 環境準備 1)克隆RHEL79_mysql_master 2)改名為 “RHEL79_mysql_slave” 并修改IP 3)修改主機名 3. 部署MySQL主從同步 1)主庫(mysql-master) 2&…

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》

《用 asyncio 構建異步任務隊列:Python 并發編程的實戰與思考》 一、引言:并發編程的新時代 在現代軟件開發中,性能已不再是錦上添花,而是產品成功的基石。尤其在 I/O 密集型場景中,如網絡爬蟲、實時數據處理、微服務通信等,傳統的同步編程模式往往力不從心。 Python …

【Linux】yum工具篇

目錄一、軟件包管理器1.1 什么是軟件包1.2 Linux軟件生態二、yum具體操作2.1 查找軟件包2.2 安裝軟件包2.3 卸載軟件配置文件所在路徑個人主頁<—請點擊 Linux專欄<—請點擊 一、軟件包管理器 1.1 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼…

撬動制造全場景增效,開利空調找到了怎樣的“通關密碼”?

由深圳軟件協會指導、法大大和信息俠聯合出品的《制造行業合同數智化升級白皮書》&#xff08;以下簡稱“白皮書”&#xff09;首次提出了 “電子簽法律AI” 雙輪驅動模型。在制造行業面臨供應鏈協同、合規風控及全球化出海等多重挑戰的當下&#xff0c;法大大依托豐富的制造企…

[Android]RecycleView的item用法

RecyclerView 是 Android 提供的一個強大的列表控件&#xff0c;用來顯示大量數據。RecyclerView 的主要特點 1. 高性能的視圖復用機制 Recycle就是循環的意思&#xff0c;那么recycleview的特點也很鮮明了&#xff0c;它只會創建出在屏幕內和一定緩存的itemview,當view滑出屏幕…

AI驅動的軟件測試:革命性的自動化、缺陷檢測與實驗優化

引言在當今快節奏的軟件開發生命周期&#xff08;SDLC&#xff09;中&#xff0c;傳統測試方法已逐漸無法滿足對速度、覆蓋面和準確性的極高要求。人工智能&#xff08;AI&#xff09;和機器學習&#xff08;ML&#xff09;技術的融入&#xff0c;正在從根本上重塑軟件測試的格…

繼續優化基于樹狀數組的cuda前綴和

在之前的博客《借助樹狀數組的思想實現cuda版前綴和》中&#xff0c;我們用三個kernel實現了基于樹狀數組的cuda版前綴和&#xff0c;但是在數據量較大時速度不如傳統的reduce-then-scan方法&#xff0c;主要原因在于跨block的reduce階段沒有充分利用所有的cuda核心。在本博客中…

Qt圖片資源導入

右鍵項目&#xff0c;點擊添加新文件 選擇Qt -> Qt Resource File 資源文件起名 如&#xff1a;res 生成res.qrc文件 在項目的同級目錄下創建文件夾res&#xff0c;并將準備好的資源粘貼進去 右鍵qrc文件&#xff0c;選中Open in Editor 添加前綴 前綴是各種類型圖片的分類&…

嵌入式第四十六天(51單片機(中斷,定時器))

一.獨立按鍵設置1.#include "key.h"void init_key(void) {P1 | (0x0F << 4); }int key_pressed(void) {static int ret 0;if((P1 & (1 << 4)) 0){ret 1;}else if((P1 & (1 << 5)) 0){ret 2;}else if((P1 & (1 << 6)) 0){r…

Visual Studio Code2024安裝包及安裝教程

一、軟件下載軟件名稱&#xff1a;Visual Studio Code 2024安裝環境&#xff1a;window10及以上系統下載鏈接&#xff1a;https://pan.quark.cn/s/d9831b28c69a解壓軟件Bandizip下載鏈接&#xff1a;https://pan.quark.cn/s/a54e79b5d553二、軟件安裝1、下載后&#xff0c;先解…

fps:游戲玩法

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄游戲玩法倒計時僵尸潮游戲成功&失敗計時玩法&#xff1a;玩家在計時內存活&#xff0c;成功&#xff1b;反之失敗Game界面&#xff1a;由關卡調用計時系統計時完成&#xff1a;調用結果界面結果界面玩家死亡&…

如何建立針對 .NET Core web 程序的線程池的長期監控

如何建立針對 .NET Core web 程序的線程池的長期監控 建立針對 .NET Core Web 應用程序線程池的長期監控是一個系統性的工程&#xff0c;它涉及代碼集成、指標收集、存儲、可視化和告警。 核心思路 線程池監控不是孤立的&#xff0c;它必須與應用程序的整體性能指標&#xff08…

前端開發學習路徑

前端開發學習路徑前端開發基礎技能HTML、CSS和JavaScript是前端開發的三大核心技術。HTML用于構建網頁結構&#xff0c;CSS負責樣式設計&#xff0c;JavaScript實現交互功能。掌握這三項技術是學習前端開發的基礎。現代前端開發通常需要了解ES6語法&#xff0c;包括箭頭函數、解…

一款沒有任何限制的免費遠程手機控制手機的軟件簡介

這是一款沒有任何限制的免費遠程手機控制手機的軟件支持安卓和蘋果1.安裝1.1被控制端安裝airdroid1.2控制端air mirror2.登錄同一個賬號3.控制使用打開控制端軟件選擇要控制的機器直接點“遠程控制“連接上后就可以任意操作被控手機了