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

SpringMVC 源碼深度解析:DispatcherServlet 初始化與請求處理流程

     編輯:Java 相關知識

SpringMVC 核心是 DispatcherServlet,繼承體系:HttpServlet → HttpServletBean → FrameworkServlet → DispatcherServlet。本文剖析三大階段:Servlet 初始化、WebApplicationContext 建立、請求分發處理。

1. 初始化鏈路

  • HttpServletBean.init():解析 web.xml <init-param>,用 BeanWrapper 綁定屬性 (如 contextConfigLocation)。
  • FrameworkServlet.initServletBean():調用 initWebApplicationContext() 建立 SpringMVC 專屬 WebApplicationContext,父上下文為 ContextLoaderListener 建立的根上下文。
  • DispatcherServlet.onRefresh():初始化九大策略介面實現 (HandlerMapping, HandlerAdapter, ViewResolver, HandlerExceptionResolver 等),掃描容器 Bean 或載入預設實現。

2. 請求處理入口

HttpServlet.service() → FrameworkServlet.processRequest() → DispatcherServlet.doService() → doDispatch()。

3. doDispatch 核心流程

  1. 獲取 Handler:遍歷 HandlerMapping 根據 URL 找到 HandlerMethod (Controller 方法)。
  2. 建立 HandlerExecutionChain:攔截器鏈 + HandlerMethod。
  3. 尋找 HandlerAdapter:支援該 Handler 的適配器 (如 RequestMappingHandlerAdapter)。
  4. 執行攔截器 preHandle。
  5. 參數解析:HandlerMethodArgumentResolver 解析方法參數 (RequestParam, RequestBody, 自訂註解等)。
  6. 調用 Controller 方法 得到返回值。
  7. 返回值處理:HandlerMethodReturnValueHandler 轉換為 ModelAndView。
  8. 異常處理:HandlerExceptionResolver 處理過程中拋出的異常。
  9. 視圖渲染:ViewResolver 解析視圖名,View.render() 輸出響應。
  10. 執行攔截器 postHandle / afterCompletion。

關鍵原始碼片段

// FrameworkServlet.initWebApplicationContext()
ConfigurableWebApplicationContext wac = createWebApplicationContext();
wac.setParent(rootContext); // 關聯父上下文
configureAndRefreshWebApplicationContext(wac); // 刷新容器,觸發 onRefresh

// DispatcherServlet.initStrategies() 初始化策略
this.handlerMappings = initHandlerMappings(wac);
this.handlerAdapters = initHandlerAdapters(wac);
this.viewResolvers = initViewResolvers(wac);
...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved