Spring MVC設計精粹:源碼級架構解析與實踐指南

文章目錄

    • 一、設計哲學:分層與解耦
      • 1. 前端控制器模式
      • 2. 分層架構設計
    • 二、核心組件源碼解析
      • 1. DispatcherServlet - 九大組件初始化
      • 2. DispatcherServlet - 前端控制器(請求處理中樞)
        • 請求源碼入口:FrameworkServlet#doGet()
        • 請求委托分發:DispatcherServlet#doService()
        • 核心請求處理:DispatcherServlet#doDispatch()
      • 3. HandlerMapping - 請求映射處理器(請求路由引擎)
      • 4. HandlerAdapter - 處理器適配器
      • 5. HandlerMethodArgumentResolver - 參數解析器
      • 6. HandlerMethodReturnValueHandler - 返回值處理器
      • 7. RequestToViewNameTranslator - 視圖名轉換器
      • 8. HandlerExceptionResolvers - 異常解析器
      • 9. ViewResolver - 視圖解析器(渲染視圖)
      • 10. LocaleResolver - 地區區域解析器(國際化i18n)
    • 三、請求處理全流程剖析
      • 關鍵流程說明:
    • 四、核心設計模式應用
      • 1. 策略模式(組件可插拔)
      • 2. 模板方法模式(流程標準化)
      • 3. 責任鏈模式(攔截器棧)
    • 五、擴展機制實戰
      • 1. 自定義參數解析器
      • 2. 自定義視圖解析器
    • 六、性能優化設計
      • 1. 映射緩存機制
      • 2. 快速失敗機制
      • 3. 性能優化方案
    • 七、Spring MVC 設計精髓總結
    • 擴展

Spring MVC作為Java Web開發的標桿框架,其優雅的設計思想和可擴展架構值得我們深入探究。它是 Spring 框架的核心模塊,采用了經典的前端控制器模式,本文將結合核心源碼,揭示其內部工作機制。

關于Spring MVC上下文容器DispatcherServlet 容器)的啟動-創建-初始化,可以參閱文章:【Spring MVC上下文容器在Web容器中是如何啟動的(源碼深入剖析)?】

一、設計哲學:分層與解耦

1. 前端控制器模式

Spring MVC 是 Spring 框架的核心模塊,Spring MVC采用了經典的前端控制器模式,通過高度組件化的設計實現職責分離和可擴展性:
在這里插入圖片描述

核心設計原則:

  1. 單一職責:每個組件只負責特定功能
  2. 開閉原則:通過接口擴展而非修改
  3. 分層處理:請求處理流程清晰分層

DispatcherServlet 作為統一入口,接收所有 HTTP 請求;通過策略接口將請求處理職責分發給不同組件

2. 分層架構設計

在這里插入圖片描述

  • 控制層(Controller):處理請求,協調業務邏輯
  • 業務層(Service):實現核心業務邏輯
  • 數據層(DAO):處理數據持久化
  • 視圖層(View):渲染響應結果

二、核心組件源碼解析

1. DispatcherServlet - 九大組件初始化

源碼路徑org.springframework.web.servlet.DispatcherServlet
核心方法initStrategies
在這里插入圖片描述

初始化文件解析器:initMultipartResolver()

在這里插入圖片描述

  • 組件主要作用:文件上傳解析器的作用是將 multipart/form-data 類型的請求解析為普通的表單字段和文件字段,便于后續處理。
  • 標準實現類StandardServletMultipartResolver
    • MultipartResolver 接口的標準實現
    • 基于 Servlet 3.0 的 javax.servlet.http.Part API
    • 需要在 web.xml 或通過編程方式配置 Servlet 的 "multipart-config"
  • 核心功能源碼
    1. 多部分請求檢測 - 通過 isMultipart() 方法檢查請求內容類型是否為 "multipart/"
      在這里插入圖片描述
    2. 多部分請求解析 - 使用 resolveMultipart() 方法將普通請求轉換為 MultipartHttpServletRequest
      在這里插入圖片描述
    3. 資源清理 - 通過 cleanupMultipart() 方法刪除上傳的臨時文件
      在這里插入圖片描述

初始化地區區域解析器(國際化i18n):initLocaleResolver()

在這里插入圖片描述

  • 組件主要作用:用于根據請求確定當前的區域設置(Locale)。它允許應用程序支持國際化本地化功能,例如根據用戶的語言偏好顯示內容。,LocaleResolver 的默認實現是 AcceptHeaderLocaleResolver,它通過 HTTP 請求頭中的 Accept-Language 來解析用戶的區域設置。
  • 默認實現類org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    • 實現了 LocaleResolver 接口
    • 基于 HTTP 請求頭中的 "Accept-Language" 字段來確定客戶端的區域設置
    • 這是 Spring MVC 默認的區域解析器
  • 核心功能
    • 支持的區域列表: 可通過 setSupportedLocales() 方法配置支持的區域列表進行匹配
    • 默認區域設置: 可通過 setDefaultLocale() 方法設置當請求中沒有 Accept-Language 頭時的默認區域
    • 智能匹配機制:
      • 優先匹配完整的語言和國家/地區組合
      • 當沒有完全匹配時,會嘗試匹配語言部分
      • 按照請求中 Accept-Language 頭的優先級順序進行匹配

初始化主題解析器:initThemeResolver()

在這里插入圖片描述

  • 組件主要作用:根據請求確定當前的主題(例如頁面的樣式或布局);默認的 FixedThemeResolver 會固定使用一個主題,無法動態切換。用處不大😂。
  • 默認實現類org.springframework.web.servlet.theme.FixedThemeResolver
    • 繼承自 AbstractThemeResolver
    • 實現了 ThemeResolver 接口
    • 提供固定的主題解析策略
  • 核心功能點
    • 固定主題返回 - resolveThemeName() 方法總是返回同一個預設的主題名稱
    • 不支持動態更改 - setThemeName() 方法拋出 UnsupportedOperationException,因為主題是固定的無法更改

初始化處理器映射器(路由映射):initHandlerMappings()

在這里插入圖片描述

  • 組件主要作用:負責建立 HTTP 請求與處理器(Handler)之間的映射關系。它的核心作用可概括為:根據請求信息(URL、請求方法、請求頭等)找到對應的處理器(Controller 方法)
  • 默認實現org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
  • 常用實現RequestMappingHandlerMapping
    • 繼承自 RequestMappingInfoHandlerMapping
    • 實現了 MatchableHandlerMappingEmbeddedValueResolverAware 接口
    • Spring MVC 3.1 版本引入,是基于注解的請求映射核心組件
  • 核心初始化源碼
  1. 請求映射創建 - 從帶有 @RequestMapping 注解的控制器類和方法創建 RequestMappingInfo 實例
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

  2. 處理器檢測 - 通過 isHandler() 方法識別帶有 @Controller@RequestMapping 注解的類
    在這里插入圖片描述

初始化處理器適配器(調用 Controller):initHandlerAdapters()

在這里插入圖片描述

  • 組件主要作用HandlerAdapter 是連接 DispatcherServlet 與具體處理器(Handler)的關鍵組件,負責實際調用處理器方法并處理返回值。Spring MVC 提供了多種默認實現,支持不同類型的處理器。
  • 默認實現org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
  • 常用實現RequestMappingHandlerAdapter
    • 繼承自 AbstractHandlerMethodAdapter
    • 實現了 BeanFactoryAwareInitializingBean 接口
    • Spring MVC 3.1 版本引入,是基于注解的請求處理核心組件
  • 核心初始化源碼
    在這里插入圖片描述
    在這里插入圖片描述

初始化異常解析器:initHandlerExceptionResolvers

在這里插入圖片描述

  • 組件主要作用HandlerExceptionResolver 是處理控制器執行過程中拋出異常的核心組件。Spring 提供了多個默認實現,共同構成了異常處理的完整體系。
  • 核心初始化源碼
    在這里插入圖片描述
    在這里插入圖片描述

初始化視圖名轉換器:initRequestToViewNameTranslator()

在這里插入圖片描述

  • 組件主要作用RequestToViewNameTranslator 是一個關鍵的視圖解析輔助組件,它負責在控制器方法沒有顯式返回視圖名稱時,自動根據請求信息推導出默認的視圖名稱
  • 默認實現類org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

初始化視圖解析器(渲染視圖):initViewResolvers()

在這里插入圖片描述

  • 組件主要作用ViewResolver 是 Spring MVC 的關鍵組件,負責將控制器返回的邏輯視圖名稱解析為實際的視圖對象(View),以便后續渲染為最終輸出(如HTML頁面或JSON響應)?
  • 默認實現類org.springframework.web.servlet.view.InternalResourceViewResolver
  • 核心初始化源碼
    在這里插入圖片描述

初始化Flash 屬性管理器:initFlashMapManager()

在這里插入圖片描述

  • 組件主要作用FlashMapManager 是 Spring MVC 中用于在重定向場景下跨請求傳遞臨時參數的核心組件,其默認實現基于 Session 存儲,確保參數在重定向后自動傳遞且無需暴露在 URL 中。
  • 默認實現類org.springframework.web.servlet.support.SessionFlashMapManager

2. DispatcherServlet - 前端控制器(請求處理中樞)

源碼路徑org.springframework.web.servlet.DispatcherServlet
核心方法doDispatch()
一次HTTP請求過程

  • DispatcherServlet#doGet()/doPost()/..[FrameworkServlett#doGet()/doPost()/..]
  • –>FrameworkServlet#processRequest()
  • –>FrameworkServlet#doService()[DispatcherServlet#doService()]
  • –>DispatcherServlet#doDispatch()
請求源碼入口:FrameworkServlet#doGet()

在這里插入圖片描述
在這里插入圖片描述

請求委托分發:DispatcherServlet#doService()

在這里插入圖片描述

核心請求處理:DispatcherServlet#doDispatch()

在這里插入圖片描述

3. HandlerMapping - 請求映射處理器(請求路由引擎)

以常用的 HandlerMapping 實現類 RequestMappingHandlerMapping 進行分析。
源碼路徑org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
源碼解析

DispatcherServlet.getHandler()

在這里插入圖片描述
AbstractHandlerMapping.getHandler()

在這里插入圖片描述

AbstractHandlerMethodMapping.getHandlerInternal()

在這里插入圖片描述

AbstractHandlerMethodMapping.lookupHandlerMethod()

在這里插入圖片描述

AbstractHandlerMethodMapping.addMatchingMappings()

在這里插入圖片描述

RequestMappingInfoHandlerMapping.getMatchingMapping()

在這里插入圖片描述

這里最終調用的是RequestMappingInfo#getMatchingCondition()方法, 貌似看跟 RequestMappingHandlerMapping 沒啥關系,但是玄機就在于RequestMappingInfo這個對象的來源:

  • 它負責創建和配置 RequestMappingInfo 對象
  • 它提供匹配所需的上下文配置(如是否支持后綴匹配等)
  • 它決定了哪些類和方法應該被當作處理器處理(通過 isHandler() 方法)
  • 它提供了創建映射信息的邏輯(通過 getMappingForMethod() 方法)

所以雖然直接調用的是 RequestMappingInfo 的方法,但 RequestMappingHandlerMapping 提供了匹配所需的配置和上下文,是整個機制不可缺少的一部分。

最后:這里最終會獲得一個HandlerMapping 對象,加之基于請求path配置的所有匹配的一個或多個HandlerInterceptor對象一起包裝為HandlerExecutionChain對象并返回。

4. HandlerAdapter - 處理器適配器

以常用的 HandlerAdapter 實現類 RequestMappingHandlerAdapter 進行分析。
源碼路徑org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
核心方法handleInternal()
源碼解析

在這里插入圖片描述

AbstractHandlerMethodAdapter.supports()

在這里插入圖片描述

RequestMappingHandlerAdapter.supportsInternal()

在這里插入圖片描述
核心要點:最終這里會返回一個可以使用的HandlerAdapter,即RequestMappingHandlerAdapter;關于RequestMappingHandlerAdapter.supportsInternal()總是返回true這里在闡述下:

  • 專用適配器RequestMappingHandlerAdapter 是專門為處理帶有 @RequestMapping 注解的處理器方法而設計的,所以它支持所有 HandlerMethod 實例。
  • 前期篩選:在請求處理流程中,已經通過 RequestMappingHandlerMapping 確保了只有帶有 @RequestMapping 注解的方法才會被路由到這個適配器。
  • 靈活性:通過返回 true,該適配器可以處理所有通過 RequestMappingHandlerMapping 映射的處理器方法,無需額外的運行時檢查。

這個方法的設計體現了Spring MVC的職責分離原則RequestMappingHandlerMapping 負責確定哪些方法可以處理請求,而 RequestMappingHandlerAdapter 負責實際執行這些方法。由于這兩個組件是成對工作的,所以適配器可以安全地接受所有由映射器提供的處理器方法

在找到合適的HandlerAdapter之后會先執行HandlerExecutionChain的前置攔截器處理邏輯,源碼如下:

HandlerExecutionChain.applyPreHandle()

在這里插入圖片描述

所有已注冊匹配的攔截器鏈上的前置攔截邏輯正常執行完畢之后緊接著才實際調用處理器核心處理方法(HandlerAdapter.handle()),返回結果視圖對象,源碼如下:

AbstractHandlerMethodAdapter.handle()

在這里插入圖片描述

RequestMappingHandlerAdapter.handleInternal()

在這里插入圖片描述

RequestMappingHandlerAdapter.invokeHandlerMethod()

在這里插入圖片描述

ServletInvocableHandlerMethod.invokeAndHandle()

在這里插入圖片描述
核心要點:這里最后執行 invokeAndHandle() 方法是Spring MVC執行控制器方法和處理返回值的關鍵環節,它通過策略模式使用不同的返回值處理器來處理各種類型的返回值,實現了高度靈活的返回值處理機制。

RequestMappingHandlerAdapter.getModelAndView()

在這里插入圖片描述

核心要點:至此,執行完了 HandlerMethod(處理 HTTP 請求),最后并返回 ModelAndView對象(如果是通過 @ResponseBody 直接寫入響應,則返回null)。

5. HandlerMethodArgumentResolver - 參數解析器

以常用的 HandlerMethodArgumentResolver 實現類 RequestResponseBodyMethodProcessor 進行分析。
源碼路徑org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
核心方法resolveArgument()
源碼解析

在這里插入圖片描述

InvocableHandlerMethod.getMethodArgumentValues()

在這里插入圖片描述

HandlerMethodArgumentResolverComposite.supportsParameter()

在這里插入圖片描述

HandlerMethodArgumentResolverComposite.getArgumentResolver()

在這里插入圖片描述

RequestResponseBodyMethodProcessor.supportsParameter()

在這里插入圖片描述

HandlerMethodArgumentResolverComposite.resolveArgument()

在這里插入圖片描述

RequestResponseBodyMethodProcessor.resolveArgument()

在這里插入圖片描述
核心要點getMethodArgumentValues() 方法通過策略模式組合模式,實現了靈活的參數解析機制,使得Spring MVC能夠處理各種類型的控制器方法參數,這是Spring MVC參數綁定功能的核心實現。
常見的參數解析器:

  • @PathVariable -> PathVariableMethodArgumentResolver
  • @RequestParam -> RequestParamMethodArgumentResolver
  • @RequestBody -> RequestResponseBodyMethodProcessor
  • @RequestHeader -> RequestHeaderMethodArgumentResolver

6. HandlerMethodReturnValueHandler - 返回值處理器

以常用的 HandlerMethodReturnValueHandler 實現類 RequestResponseBodyMethodProcessor 進行分析。
源碼路徑org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
核心方法handleReturnValue()
源碼解析

在這里插入圖片描述

HandlerMethodReturnValueHandlerComposite.selectHandler()

在這里插入圖片描述

RequestResponseBodyMethodProcessor.supportsReturnType()

在這里插入圖片描述

RequestResponseBodyMethodProcessor.handleReturnValue()

在這里插入圖片描述

核心要點handleReturnValue() 方法是實現RESTful API的關鍵組件,它使Spring MVC能夠直接將Java對象序列化為HTTP響應體,支持多種數據格式(JSON、XML等),是現代Web開發中處理API響應的核心機制。

7. RequestToViewNameTranslator - 視圖名轉換器

以常用的 RequestToViewNameTranslator 實現類 DefaultRequestToViewNameTranslator 進行分析。
源碼路徑org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
核心方法getViewName()
源碼解析

在這里插入圖片描述

DispatcherServlet.getDefaultViewName()

在這里插入圖片描述

DefaultRequestToViewNameTranslator.getViewName()

在這里插入圖片描述

核心要點getViewName() 是 DefaultRequestToViewNameTranslator 類的核心方法,,該方法提供了一種約定優于配置的方式,根據HTTP請求URL自動生成合適的視圖名稱。

方法執行到這里其主要的邏輯已經執行完畢了, 有了完整的返回結果, 這時會執行攔截器的后置處理方法applyPreHandle()), 攔截器來源于前面匹配的 HandlerExecutionChain ,其源碼如下:

HandlerExecutionChain.applyPostHandle()

在這里插入圖片描述

接下就是最終環節了, 處理結果(渲染視圖/處理異常)等, 接著往下看源碼:

DispatcherServlet.processDispatchResult()

在這里插入圖片描述

8. HandlerExceptionResolvers - 異常解析器

以常用的 HandlerExceptionResolvers 實現類 ExceptionHandlerExceptionResolver 進行分析。
源碼路徑org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver
核心方法doResolveHandlerMethodException()
源碼解析

在這里插入圖片描述

HandlerExceptionResolverComposite.resolveException()

在這里插入圖片描述

AbstractHandlerExceptionResolver.resolveException()
在這里插入圖片描述

AbstractHandlerMethodExceptionResolver.doResolveException()

在這里插入圖片描述

ExceptionHandlerExceptionResolver.doResolveHandlerMethodException()

在這里插入圖片描述

核心要點:這里正常情況下我們通過 ExceptionHandlerExceptionResolverdoResolveHandlerMethodException()方法找到對應的異常處理方法(標注@ExceptionHandler)進行了異常的處理,所有實際會返回一個空的ModelAndView,外層判斷空的 ModelAndView是直接返回 null,表示異常已經處理完畢,不需要再進行后續處理。

9. ViewResolver - 視圖解析器(渲染視圖)

以常用的 ViewResolver 實現類 InternalResourceViewResolver 進行分析。
源碼路徑org.springframework.web.servlet.view.InternalResourceViewResolver
核心方法resolveViewName()
源碼解析

在這里插入圖片描述

DispatcherServlet.resolveViewName()
在這里插入圖片描述

ViewResolverComposite.resolveViewName()

在這里插入圖片描述

AbstractCachingViewResolver.resolveViewName()
在這里插入圖片描述

AbstractCachingViewResolver.createView()

在這里插入圖片描述

UrlBasedViewResolver.loadView()

在這里插入圖片描述

InternalResourceViewResolver.buildView()

在這里插入圖片描述

UrlBasedViewResolver.buildView()

在這里插入圖片描述
核心要點:由源碼可知完整的實現鏈是:AbstractCachingViewResolver 定義了緩存機制和模板方法;UrlBasedViewResolver 實現了 loadView 并提供了 buildView 模板方法;InternalResourceViewResolver 重寫了 buildView 方法以添加 InternalResourceView 特定的配置;
這種設計充分利用了模板方法模式,使得每一層都只關注自己的職責。
其實到這里已經創建了一個完整的 View 對象了, 接下來還需要調用 View 對象的 render() 方法來渲染視圖。
View.render() 是一個接口方法,不同的視圖實現類會有不同的實現。以最常見的 InternalResourceView(用于 JSP 渲染)為例接著分析,源碼如下:

AbstractView.render()

在這里插入圖片描述

InternalResourceView.renderMergedOutputModel()

在這里插入圖片描述

核心要點view.render() 這個方法是 Spring MVC 視圖渲染的核心方法,也是視圖渲染的終點,將處理結果轉換為實際的 HTTP 響應內容。
常見的

10. LocaleResolver - 地區區域解析器(國際化i18n)

以常用的 LocaleResolver 實現類 AcceptHeaderLocaleResolver 進行分析。
源碼路徑org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
核心方法resolveLocale()
源碼解析

AcceptHeaderLocaleResolver.resolveLocale()

在這里插入圖片描述

核心要點LocaleResolver 的實現類提供了不同的區域設置解析策略,開發者可以根據應用需求選擇合適的實現。調用鏈路從 DispatcherServlet 初始化開始,貫穿整個請求處理過程,最終在視圖渲染時使用解析到的區域設置

三、請求處理全流程剖析

在這里插入圖片描述

關鍵流程說明:

  1. 請求分發:DispatcherServlet 接收所有請求
  2. 處理器映射:通過 HandlerMapping 找到匹配的 Controller 方法
  3. 參數解析:HandlerAdapter 使用 ArgumentResolvers 解析方法參數
  4. 業務執行:調用 Controller 業務邏輯
  5. 返回值處理:使用 ReturnValueHandlers 處理返回值
  6. 視圖解析:ViewResolver 將邏輯視圖名解析為具體 View
  7. 視圖渲染:View 對象渲染響應內容

四、核心設計模式應用

1. 策略模式(組件可插拔)

public interface HandlerMapping {HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(...) throws Exception;
}
  • 不同實現類處理不同類型的處理器
  • 可通過配置替換默認實現
  • 運行時動態選擇適配器

2. 模板方法模式(流程標準化)

public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter {public final ModelAndView handle(...) throws Exception {// 固定處理流程checkRequest(request);return handleInternal(request, response, handlerMethod);}// 子類實現具體邏輯protected abstract ModelAndView handleInternal(...) throws Exception;
}

3. 責任鏈模式(攔截器棧)

public class HandlerExecutionChain {private final List<HandlerInterceptor> interceptorList = new ArrayList<>();boolean applyPreHandle(...) {// 順序執行攔截器前置處理for (HandlerInterceptor interceptor : interceptorList) {if (!interceptor.preHandle(request, response, this.handler)) {return false;}}return true;}
}

五、擴展機制實戰

1. 自定義參數解析器

public class CustomArgumentResolver implements HandlerMethodArgumentResolver {@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.hasParameterAnnotation(CustomAnnotation.class);}@Overridepublic Object resolveArgument(...) {// 自定義參數解析邏輯return customValue;}
}// 注冊到Spring容器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(new CustomArgumentResolver());}
}

2. 自定義視圖解析器

public class CustomViewResolver implements ViewResolver {@Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {if (viewName.startsWith("custom:")) {return new CustomView(); // 自定義視圖實現}return null; // 交給其他解析器處理}
}

六、性能優化設計

1. 映射緩存機制

public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping {// 映射關系緩存private final MappingRegistry mappingRegistry = new MappingRegistry();class MappingRegistry {// URL到HandlerMethod的映射緩存private final Map<String, MappingRegistration<T>> registry = new HashMap<>();// 方法簽名緩存private final Map<HandlerMethod, T> mappingLookup = new LinkedHashMap<>();}
}

2. 快速失敗機制

public class DispatcherServlet extends FrameworkServlet {protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {try {// 處理流程...} catch (Exception ex) {// 快速捕獲異常processDispatchResult(..., ex);}}
}

3. 性能優化方案

@Configuration
public class PerformanceConfig {// 限制上傳文件大小@Beanpublic MultipartResolver multipartResolver() {CommonsMultipartResolver resolver = new CommonsMultipartResolver();resolver.setMaxUploadSize(1024 * 1024 * 10); // 10MBreturn resolver;}// 啟用GZIP壓縮@Beanpublic FilterRegistrationBean<GzipFilter> gzipFilter() {FilterRegistrationBean<GzipFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new GzipFilter());registration.addUrlPatterns("/*");return registration;}
}

七、Spring MVC 設計精髓總結

  • 組件化架構:9大核心組件各司其職;通過策略接口實現松耦合
  • 擴展點豐富:14+擴展接口覆蓋請求處理全生命周期;支持自定義參數解析、返回值處理等
  • 分層處理:清晰的請求處理流水線
  • 性能優化:映射關系緩存 + 懶加載機制 + 快速失敗處理
  • 與現代技術融合:無縫支持 RESTful、完美整合 WebSocket、兼容響應式編程模型
  • 設計模式典范:前端控制器模式統一入口 + 策略模式實現組件替換 + 模板方法模式固定流程

Spring MVC的優雅不僅在于功能強大,更在于其精心設計的擴展性可維護性。理解其底層架構,能讓我們在復雜業務場景中游刃有余。


End!


擴展

MultipartResolver Diagram
在這里插入圖片描述

LocaleResolver Diagram
在這里插入圖片描述

ThemeResolver Diagram
在這里插入圖片描述

HandlerMapping Diagram
在這里插入圖片描述

HandlerAdapter Diagram
在這里插入圖片描述

HandlerExceptionResolver Diagram
在這里插入圖片描述

RequestToViewNameTranslator Diagram
在這里插入圖片描述

ViewResolver Diagram
在這里插入圖片描述

FlashMapManager Diagram
在這里插入圖片描述

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

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

相關文章

k8s之控制器詳解

1.deployment&#xff1a;適用于無狀態服務1.功能(1)創建高可用pod&#xff08;2&#xff09;滾動升級/回滾&#xff08;3&#xff09;平滑擴容和縮容2.操作命令&#xff08;1&#xff09;回滾# 回滾到上一個版本 kubectl rollout undo deployment/my-app# 回滾到特定版本&…

.NET Core中的配置系統

傳統配置方式文件Web.config 進行配置。ConfigurationManager類配置。.NET配置系統中支持配置方式文件配置&#xff08;json、xml、ini等&#xff09;注冊表環境變量命令行自定義配置源Json文件配置方式實現步驟&#xff1a;創建一個json文件&#xff0c;把文件設置 為“如果較…

kafka的消費者負載均衡機制

Kafka 的消費者負載均衡機制是保證消息高效消費的核心設計&#xff0c;通過將分區合理分配給消費者組內的消費者&#xff0c;實現并行處理和負載均衡。以下從核心概念、分配策略、重平衡機制等方面詳細講解。一、核心概念理解消費者負載均衡前&#xff0c;需明確三個關鍵概念&a…

騰訊云edges on部署pages

騰訊云edges on部署pages適用場景部署方式官方文檔 適用場景 Next.js Hexo 以及用React Vue等現代前端框架構建的單頁應用全棧項目開發 通過Pages Function KV等能力 實現輕量化的動態服務快速部署與迭代 通過Github等代碼管理平臺集成 每次代碼提交時自動構建和部署網站 注…

SpringAI入門及淺實踐,實戰 Spring? AI 調用大模型、提示詞工程、對話記憶、Adv?isor 的使用

上一次寫AI學習筆記已經好久之前了&#xff0c;溫習溫習&#xff0c;這一章講講關于Spring? AI 調用大模型、對話記憶、Adv?isor、結構化輸出、自定義對話記憶?、Prompt 模板的相關知識點。 快速跳轉到你感興趣的地方一、提示詞工程&#xff08;Prompt&#xff09;1. 基本概…

對抗攻擊-知識點

文章目錄自然圖像往往靠近機器學習分類器學習到的決策邊界&#xff08;decision boundaries&#xff09;。正交方向--改變某一個不影響其它的特征降采樣&#xff08;Feature Downsampling&#xff09;通過黑盒攻擊的持續挑戰&#xff0c;我們才能構建真正安全可靠的智能系統DCT…

7.26 作業

一、實驗要求及其拓撲圖&#xff1a; 本次實驗拓撲圖&#xff1a; 二、實驗IP地址劃分&#xff1a; 1. 公網地址&#xff08;R5 作為 ISP&#xff0c;使用公網地址&#xff09;&#xff1a; R1 與 R5 之間接口&#xff1a;15.1.1.0/24&#xff0c;R1 側為 15.1.1…

Kafka運維實戰 14 - kafka消費者組消費進度(Lag)深入理解【實戰】

目錄什么是消費者 Lag舉例說明&#xff1a;Lag 的意義&#xff1a;Lag 監控和查詢kafka-consumer-groups基本語法常用命令示例1. 查看單個消費者組的詳細信息&#xff08;最常用&#xff09;2. 列出所有消費者組&#xff08;只顯示名稱&#xff09;3. 列出所有消費者組&#xf…

設計模式(十三)結構型:代理模式詳解

設計模式&#xff08;十三&#xff09;結構型&#xff1a;代理模式詳解代理模式&#xff08;Proxy Pattern&#xff09;是 GoF 23 種設計模式中的結構型模式之一&#xff0c;其核心價值在于為其他對象提供一種間接訪問的機制&#xff0c;以控制對原始對象的訪問。它通過引入一個…

24點數學游戲(窮舉法求解表達式)

摘要本畢業設計旨在利用MATLAB技術實現一個24點數學游戲&#xff0c;采用窮舉法求解所有可能的表達式組合。通過全排列數字、枚舉運算符及括號位置&#xff0c;結合遞歸回溯算法&#xff0c;系統能夠高效地搜索所有可能的運算路徑&#xff0c;并驗證結果是否為24。實驗結果表明…

【web應用】如何進行前后端調試Debug? + 前端JavaScript調試Debug?

文章目錄一、前后端&#xff1a;后端以Debug模式運行后端項目&#xff0c;打斷點二、前后端&#xff1a;前端項目在瀏覽器中調試三、單獨前端&#xff1a;前端JavaScript調試1、控制臺輸出2、網頁調試器中添加斷點3、debugger關鍵字一、前后端&#xff1a;后端以Debug模式運行后…

FreeCAD開發樓梯參數化三維模型和鋼格柵

根據樓梯標準圖集開發各種樓梯。上行左轉&#xff0c;上行右轉&#xff0c;對應的欄桿也是配套2種。樓梯總成鋼格柵標準里的跨度和承載 扁鋼尺寸&#xff0c;輕松切換和修改參數。格柵綜合本來格柵上橫桿是冷軋扭鋼筋&#xff0c;先繪制一個圓柱&#xff0c;再做一個內切正方形…

【AcWing 836題解】合并集合

AcWing 836. 合并集合 【題目描述】 在查看解析之前&#xff0c;先給自己一點時間思考哦&#xff01; 【題解】 并查集是一種用于處理集合合并與查詢問題的數據結構&#xff0c;通常支持以下兩種操作&#xff1a; Find&#xff1a;查詢一個元素所在的集合。 Union&#xff1a…

MySQL鎖機制與MVCC原理剖析

在MySQL中&#xff0c;我們使用到了它的各種類鎖&#xff1b;按照它的維度&#xff0c;有各種鎖 從數據庫的操作粒度有&#xff0c;表鎖&#xff0c;行鎖。從數據庫的操作的類型&#xff0c;有讀鎖和寫鎖。性能上有樂觀鎖和悲觀鎖。 在上一篇文章中的事務隔離級別&#xff0c;需…

C++學習(線程相關)

目錄 一、線程庫thread 1.使用外部函數 2. 使用類的函數 3. 添加參數 二、線程庫 mutex 1.使用lock()方法 2.try_lock()方法 三、線程庫lock_guard 四、線程庫unique_lock 1.adopt_lock 2.defer_lock() 五、線程庫call_once 六、線程庫promise & future 七、c…

EPOLLONESHOT 深度解析:Linux epoll 的單次觸發機制

EPOLLONESHOT 深度解析&#xff1a;Linux epoll 的單次觸發機制 EPOLLONESHOT 是 Linux epoll 接口中的高級事件標志&#xff0c;用于實現精確的事件單次觸發控制。以下是其全面技術解析&#xff1a; 核心設計理念 #mermaid-svg-Xg5sCLdddqmKsvKG {font-family:"trebuchet…

深入解析MongoDB分片原理與運維實踐指南

深入解析MongoDB分片原理與運維實踐指南 技術背景與應用場景 隨著互聯網業務的高速發展&#xff0c;單節點MongoDB實例在數據量和訪問并發上都面臨瓶頸。為了解決數據存儲容量受限和讀寫性能下降的問題&#xff0c;MongoDB官方提供了分片&#xff08;Sharding&#xff09;方案&…

基于Django的天氣數據可視化分析預測系統

【86-Django】基于Django的天氣數據可視化分析預測系統&#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介 二、項目界面展示 三、項目視頻展示 四、技術架構 五、核心功能模塊 六、部署教程一、項目簡介 隨著全球氣候變化和極端天氣事件的頻發&am…

怎么放大單片機輸出電流

單片機作為電子系統的控制核心&#xff0c;其 I/O 口輸出電流通常較小&#xff08;一般在 10-20mA 左右&#xff09;&#xff0c;難以直接驅動繼電器、電機、大功率 LED 等需要較大工作電流的外設。因此&#xff0c;在實際應用中需通過特定電路放大單片機輸出電流&#xff0c;實…

站長百科類網站pbootcms模板(自適應手機端)+利于SEO優化(下載)

站長百科類網站pbootcms模板(自適應手機端)利于SEO優化 模板介紹&#xff1a; PbootCMS內核開發的模板&#xff0c;該模板屬于新聞資訊、新聞博客類企業使用&#xff01; 頁面簡潔簡單&#xff0c;容易管理&#xff0c;附帶測試數據&#xff01; 模板特點&#xff1a; 1、手工書…