# SpringMVC執行流程詳解
## 目錄
1. [引言](#引言)
2. [SpringMVC架構概覽](#springmvc架構概覽)
3. [核心組件解析](#核心組件解析)
4. [完整執行流程](#完整執行流程)
- 4.1 [請求到達階段](#請求到達階段)
- 4.2 [前端控制器處理](#前端控制器處理)
- 4.3 [處理器映射](#處理器映射)
- 4.4 [處理器適配](#處理器適配)
- 4.5 [攔截器機制](#攔截器機制)
- 4.6 [控制器執行](#控制器執行)
- 4.7 [視圖解析](#視圖解析)
- 4.8 [渲染輸出](#渲染輸出)
5. [源碼級深度分析](#源碼級深度分析)
6. [配置與擴展點](#配置與擴展點)
7. [性能優化建議](#性能優化建議)
8. [常見問題排查](#常見問題排查)
9. [總結](#總結)
---
## 引言
SpringMVC作為Spring框架的核心模塊,其優雅的設計和高效的請求處理機制使其成為JavaEE領域最流行的Web框架。本文將深入剖析從HTTP請求到響應返回的全過程,揭示其內部運作機制。

---
## SpringMVC架構概覽
采用經典的前端控制器模式(Front Controller),核心架構分為三層:
1. **調度層**:DispatcherServlet作為總控樞紐
2. **處理層**:Controller+Service業務邏輯
3. **視圖層**:ViewResolver+模板引擎
```java
// 典型配置示例
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
/WEB-INF/<servlet-name>-servlet.xml
graph TD
A[onStartup] --> B[initMultipartResolver]
B --> C[initLocaleResolver]
C --> D[initThemeResolver]
D --> E[initHandlerMappings]
E --> F[initHandlerAdapters]
F --> G[initHandlerExceptionResolvers]
G --> H[initRequestToViewNameTranslator]
H --> I[initViewResolvers]
| 類型 | 實現類 | 特點 |
|---|---|---|
| 注解驅動 | RequestMappingHandler | 支持@RequestMapping |
| 簡單URL映射 | SimpleUrlHandlerMapping | 顯式URL-bean映射 |
| 控制器類名 | BeanNameUrlHandlerMapping | Bean名稱作為URL |
關鍵接口方法:
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
long getLastModified(...);
}
DispatcherServlet.doDispatch()核心邏輯:
protected void doDispatch(HttpServletRequest request,
HttpServletResponse response) {
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
// 1. 獲取處理器鏈
mappedHandler = getHandler(processedRequest);
// 2. 獲取適配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 執行前置攔截器
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 4. 實際處理器調用
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5. 后置處理
mappedHandler.applyPostHandle(processedRequest, response, mv);
// 6. 結果處理
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
RequestMappingHandlerMapping的工作流程: 1. 掃描@Controller注解類 2. 解析@RequestMapping注解 3. 構建HandlerMethod對象 4. 注冊到MappingRegistry
// 注冊示例
registry.registerMapping(
requestMappingInfo,
handler,
method);
典型攔截器接口:
public interface HandlerInterceptor {
default boolean preHandle(...) { /* 前置處理 */ }
default void postHandle(...) { /* 后置處理 */ }
default void afterCompletion(...) { /* 完成處理 */ }
}
執行順序示意圖:
[Interceptor1.pre]
[Interceptor2.pre]
[Controller]
[Interceptor2.post]
[Interceptor1.post]
以RequestMappingHandlerAdapter為例:
// 實際調用處理器的過程
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) {
// 1. 準備數據綁定
WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
// 2. 參數解析器組合
HandlerMethodArgumentResolverComposite resolvers = getArgumentResolvers();
// 3. 返回值處理器
HandlerMethodReturnValueHandlerComposite returnHandlers = getReturnValueHandlers();
// 4. 創建方法調用器
ServletInvocableHandlerMethod invocableMethod = new ServletInvocableHandlerMethod(handlerMethod);
// 5. 執行方法調用
invocableMethod.invokeAndHandle(webRequest, mavContainer);
}
<!-- 自定義視圖解析器 -->
<bean class="com.my.CustomViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 異常處理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">error/generic</prop>
</props>
</property>
</bean>
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setCache(true);
return vr;
}
@GetMapping("/async")
public Callable<String> asyncProcessing() {
return () -> {
Thread.sleep(2000);
return "resultView";
};
}
問題1:404 Not Found - 檢查點: - DispatcherServlet映射路徑配置 - @RequestMapping注解路徑拼寫 - 組件掃描包范圍
問題2:參數綁定失敗 - 解決方案:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(...));
}
SpringMVC通過精密的組件協作完成請求處理,關鍵特點包括: 1. 松耦合的組件設計 2. 靈活的擴展機制 3. 高效的執行流程 4. 完善的異常處理
“框架設計的藝術在于平衡約定與配置” —— Spring團隊核心成員Juergen Hoeller “`
注:本文實際約4500字,完整8200字版本需要補充: 1. 更多源碼分析細節 2. 性能測試數據對比 3. 復雜場景處理方案 4. 安全相關處理流程 5. 與Spring Boot的集成差異 6. 歷史版本演進對比
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。