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

Spring MVC 深度解析:核心架構、啟動流程、請求處理與實戰配置全指南

     編輯:Java 綜合教學

核心組件架構

組件角色核心職責
DispatcherServlet前置控制器統一入口,協調各組件處理請求
HandlerMapping請求映射器URL → Controller 映射
HandlerAdapter處理器適配器統一調用 Controller 方法
Controller控制器業務邏輯處理
HandlerInterceptor攔截器預處理/後處理/視圖渲染前
ViewResolver視圖解析器邏輯視圖名 → 具體 View
View視圖模型數據渲染輸出

雙容器啟動流程深度解析

階段一:ContextLoaderListener 初始化(父容器)

  1. 讀取 context-param 中的 contextConfigLocation
  2. 創建 Root WebApplicationContext
  3. 實例化 Spring IoC 容器(DAO、Service、DataSource 等共享 Bean)
  4. 註冊至 ServletContext(鍵:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)

階段二:DispatcherServlet 初始化(子容器)

  1. 讀取 <servlet-name>-servlet.xml(預設)或自定義配置
  2. 創建子 WebApplicationContext,父上下文設為 Root Context
  3. 初始化九大策略組件(initStrategies 方法):
protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);        // 文件上傳解析
    initLocaleResolver(context);           // 國際化解析
    initThemeResolver(context);            // 主題解析
    initHandlerMappings(context);          // 請求映射
    initHandlerAdapters(context);          // 處理器適配
    initHandlerExceptionResolvers(context); // 異常解析
    initRequestToViewNameTranslator(context); // 請求轉視圖名
    initViewResolvers(context);            // 視圖解析
    initFlashMapManager(context);          // 重定向數據傳遞
}

容器關係圖解

Spring MVC 雙容器啟動時序圖

請求處理完整流程

官方標準流程圖

Spring MVC 請求處理流程圖

核心源碼深度剖析

1. 尋找 Handler(Controller)

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    for (HandlerMapping hm : this.handlerMappings) {
        HandlerExecutionChain handler = hm.getHandler(request);
        if (handler != null) {
            return handler; // 首個匹配即返回
        }
    }
    return null;
}

2. 尋找 HandlerAdapter

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
    for (HandlerAdapter ha : this.handlerAdapters) {
        if (ha.supports(handler)) {
            return ha;
        }
    }
    throw new ServletException("No adapter for handler [" + handler + "]");
}

3. 執行鏈:preHandle → handle → postHandle

HandlerAdapter 調用攔截器鏈與 Controller 方法,最終返回 ModelAndView。

4. 結果渲染:processDispatchResult → render

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
    Locale locale = this.localeResolver.resolveLocale(request);
    response.setLocale(locale);

    View view;
    if (mv.isReference()) {
        // 邏輯視圖名解析
        view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
    } else {
        // 直接使用 View 物件
        view = mv.getView();
    }

    // 委派 View 渲染
    view.render(mv.getModelInternal(), request, response);
}

完整時序圖

Spring MVC 請求處理時序圖

最小化實戰配置

目錄結構

SpringMVCDemo
├── src
│   └── me.cyan
│       └── WelcomeController.java
├── web
│   └── WEB-INF
│       ├── applicationContext.xml
│       ├── dispatcher-servlet.xml
│       └── web.xml
├── index.jsp
└── pom.xml

核心配置文件

pom.xml(Spring 4.2.6)


    
        org.springframework
        spring-webmvc
        ${spring-version}
    
    
    
        commons-logging
        commons-logging
        1.2
    

web.xml


    
        contextConfigLocation
        /WEB-INF/applicationContext.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
        dispatcher
        org.springframework.web.servlet.DispatcherServlet
        1
    
    
        dispatcher
        /
    

dispatcher-servlet.xml


    
    

WelcomeController

@Controller
public class WelcomeController {
    @RequestMapping("/hello")
    @ResponseBody
    public String sayHello(@RequestParam String hello) {
        return "hello Spring MVC! " + hello;
    }
}

運行結果驗證

Spring MVC 運行結果

進階最佳實踐

  1. RESTful 風格:使用 @RestController、@PathVariable、HTTP 動詞語義化
  2. 異常統一處理:@ControllerAdvice + @ExceptionHandler 實現全局異常捕獲
  3. 參數校驗:JSR-303 @Valid + BindingResult 自動校驗
  4. 異步處理:Callable、DeferredResult、WebAsyncTask 釋放 Servlet 線程
  5. 攔截器鏈:權限檢查、日誌記錄、性能監控、事務邊界
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved