首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring DispatcherServlet 核心運行機制全解析

     編輯:Java 相關知識

概述

DispatcherServlet 是 Spring MVC 的核心控制器,採用前端控制器模式,統一接收 HTTP 請求、委派處理、渲染視圖。本文梳理其初始化流程與請求處理管線。

繼承體系

HttpServlet
  └─ HttpServletBean          // init()、initBeanWrapper()
      └─ FrameworkServlet     // initServletBean()、initWebApplicationContext()
          └─ DispatcherServlet // initFrameworkServlet()、doService()

初始化流程(啟動階段)

  1. init() → initBeanWrapper():綁定 Servlet 初始化參數到 Bean 屬性
  2. initServletBean() → initWebApplicationContext():建立/取得 WebApplicationContext
  3. initFrameworkServlet() → 依序初始化九大核心組件:
順序組件功能
1MultipartResolver檔案上傳解析(CommonsMultipartResolver/StandardServletMultipartResolver)
2LocaleResolver國際化區域解析
3ThemeResolver主題解析
4HandlerMapping請求 URL 映射到處理器(RequestMappingHandlerMapping)
5HandlerAdapter處理器適配器(支援 @Controller、HttpRequestHandler 等)
6HandlerExceptionResolver異常處理(ExceptionHandlerExceptionResolver、DefaultHandlerExceptionResolver)
7ViewResolver視圖解析(InternalResourceViewResolver、ThymeleafViewResolver)
8FlashMapManager重導向屬性傳遞
9RequestResponseBodyMethodProcessor@ResponseBody 處理(Spring 4+ 內建)

請求處理流程(doService())

六大步驟構成完整管線:

  1. 多部分解析:若 multipart/form-data,包裝為 MultipartHttpServletRequest
  2. 處理器映射:getHandler(request) 取得 HandlerExecutionChain(含攔截器)
  3. 前置攔截:依序呼叫攔截器 preHandle(),任一返回 false 中斷流程
  4. 處理器執行:HandlerAdapter.handle() 呼叫控制器方法,獲得 ModelAndView
  5. 後置攔截:依序呼叫攔截器 postHandle(),可修改模型/視圖
  6. 視圖渲染:processDispatchResult() → render() 輸出回應

關鍵設計模式

  • 前端控制器:單一入口統一調度
  • 適配器模式:HandlerAdapter 屏蔽不同處理器類型差異
  • 攔截器鏈:AOP 風格橫切關注點(日誌、權限、事務)
  • 策略模式:九大組件皆為介面,可換裝實現

Spring Boot 時代的變化

  • 自動配置類 DispatcherServletAutoConfiguration 替代手動 XML 註冊
  • WebMvcAutoConfiguration 提供預設組件,支援 WebMvcConfigurer 客製化
  • 內嵌容器(Tomcat/Jetty/Undertow)自動掛載 DispatcherServlet

總結

理解 DispatcherServlet 初始化順序與請求管線,有助於排查映射失效、攔截器不生效、視圖解析異常等常見問題。核心思想:約定優於配置,策略介面可替換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved