[spring6: @EnableWebMvc]-源碼分析

源碼

EnableWebMvc

@EnableWebMvc 是用于啟用 Spring MVC 的注解,它通過導入 DelegatingWebMvcConfiguration 來加載默認的 MVC 配置,同時允許開發者通過實現 WebMvcConfigurer 接口來自定義部分配置;若需更高階的控制,則可直接繼承 WebMvcConfigurationSupportDelegatingWebMvcConfiguration

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {}

DelegatingWebMvcConfiguration

DelegatingWebMvcConfiguration@EnableWebMvc 導入的配置類,繼承自 WebMvcConfigurationSupport,通過委托 WebMvcConfigurerComposite 聚合并調用所有 WebMvcConfigurer 實現,從而實現對 Spring MVC 默認配置的擴展與定制。

@Configuration(proxyBeanMethods = false)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}@Overrideprotected void configurePathMatch(PathMatchConfigurer configurer) {this.configurers.configurePathMatch(configurer);}@Overrideprotected void configureContentNegotiation(ContentNegotiationConfigurer configurer) {this.configurers.configureContentNegotiation(configurer);}@Overrideprotected void configureAsyncSupport(AsyncSupportConfigurer configurer) {this.configurers.configureAsyncSupport(configurer);}@Overrideprotected void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {this.configurers.configureDefaultServletHandling(configurer);}@Overrideprotected void addFormatters(FormatterRegistry registry) {this.configurers.addFormatters(registry);}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {this.configurers.addInterceptors(registry);}@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {this.configurers.addResourceHandlers(registry);}@Overrideprotected void addCorsMappings(CorsRegistry registry) {this.configurers.addCorsMappings(registry);}@Overrideprotected void addViewControllers(ViewControllerRegistry registry) {this.configurers.addViewControllers(registry);}@Overrideprotected void configureViewResolvers(ViewResolverRegistry registry) {this.configurers.configureViewResolvers(registry);}@Overrideprotected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {this.configurers.addArgumentResolvers(argumentResolvers);}@Overrideprotected void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {this.configurers.addReturnValueHandlers(returnValueHandlers);}@Overrideprotected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {this.configurers.configureMessageConverters(converters);}@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {this.configurers.extendMessageConverters(converters);}@Overrideprotected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {this.configurers.configureHandlerExceptionResolvers(exceptionResolvers);}@Overrideprotected void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {this.configurers.extendHandlerExceptionResolvers(exceptionResolvers);}@Overrideprotected void configureErrorResponseInterceptors(List<ErrorResponse.Interceptor> interceptors) {this.configurers.addErrorResponseInterceptors(interceptors);}@Override@Nullableprotected Validator getValidator() {return this.configurers.getValidator();}@Override@Nullableprotected MessageCodesResolver getMessageCodesResolver() {return this.configurers.getMessageCodesResolver();}}

WebMvcConfigurationSupport

WebMvcConfigurationSupport 是 Spring Framework 中用于 Spring MVC Java 配置的核心基類,它負責默認配置 MVC 相關的基礎設施組件。

通常不直接繼承該類,而是通過在 @Configuration 類上添加 @EnableWebMvc 注解。
@EnableWebMvc 會導入 DelegatingWebMvcConfiguration,該類繼承自
WebMvcConfigurationSupport,并委托給 WebMvcConfigurer 進行擴展和定制。

1.注冊 HandlerMappings

HandlerMapping 類順序 (Order)作用說明
RouterFunctionMapping-1映射 Router Functions 路由函數
RequestMappingHandlerMapping0映射帶注解的控制器方法請求
HandlerMapping (View Controllers)1將 URL 路徑直接映射到視圖名稱
BeanNameUrlHandlerMapping2將 URL 路徑映射到控制器 Bean 名稱
HandlerMapping (Static Resources)Integer.MAX_VALUE - 1提供靜態資源請求處理
HandlerMapping (Default Servlet)Integer.MAX_VALUE將請求轉發給默認 Servlet 處理

2.注冊 HandlerAdapters

HandlerAdapter 類作用說明
RequestMappingHandlerAdapter處理帶注解的控制器方法請求
HttpRequestHandlerAdapter處理 HttpRequestHandler 類型請求
SimpleControllerHandlerAdapter處理基于接口的控制器請求
HandlerFunctionAdapter處理 Router Functions 請求

3.注冊 HandlerExceptionResolverComposite

異常解析器類作用說明
ExceptionHandlerExceptionResolver通過帶有 @ExceptionHandler 注解的方法處理異常
ResponseStatusExceptionResolver處理帶有 @ResponseStatus 注解的異常,將其映射為 HTTP 狀態碼
DefaultHandlerExceptionResolver處理 Spring 內置的已知異常類型

4.注冊 路徑匹配工具

組件用途備注
AntPathMatcher基于 Ant 風格的路徑匹配可通過 PathMatchConfigurer 配置
UrlPathHelperURL 路徑提取和處理可通過 PathMatchConfigurer 配置

5.其他

組件名作用說明備注
ContentNegotiationManager管理內容協商,根據請求頭等確定響應媒體類型默認根據類路徑中第三方庫自動配置
DefaultFormattingConversionService處理類型轉換和格式化可自定義添加轉換器和格式化器
OptionalValidatorFactoryBean如果有 JSR-303 實現(如 Hibernate Validator),提供校驗支持無實現時提供空實現,可自定義 Validator
HttpMessageConverters負責 HTTP 消息體的讀寫轉換,支持 JSON、XML 等根據類路徑中可用庫自動注冊,支持擴展定制

WebMvcConfigurer

/*** WebMvcConfigurer 是 Spring MVC 提供的一個回調接口,內置了大量默認實現的方法,* 允許開發者通過“選擇性實現”的方式,按需定制 MVC 子系統的配置,* 避免使用 XML 或完全取代框架默認行為。*/
public interface WebMvcConfigurer {/*** 配置請求路徑匹配規則,例如是否啟用尾部斜杠匹配、路徑參數支持等。*/default void configurePathMatch(PathMatchConfigurer configurer) {}/*** 配置內容協商策略,例如支持的媒體類型、默認響應類型、參數名等。*/default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}/*** 配置異步請求支持,包括超時時間、自定義線程池執行器等。*/default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}/*** 配置是否啟用默認 Servlet 來處理靜態資源請求,通常用于容器映射為 "/" 的情況。*/default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}/*** 添加自定義的類型轉換器(Converter)和格式化器(Formatter),用于數據綁定。*/default void addFormatters(FormatterRegistry registry) {}/*** 注冊攔截器,例如日志、認證、限流等。*/default void addInterceptors(InterceptorRegistry registry) {}/*** 添加靜態資源的訪問路徑、位置映射和緩存策略等。*/default void addResourceHandlers(ResourceHandlerRegistry registry) {}/*** 配置全局跨域(CORS)策略,可與 @CrossOrigin 注解配合使用。*/default void addCorsMappings(CorsRegistry registry) {}/*** 添加視圖控制器,通常用于跳轉首頁、登錄頁、404 等無需處理邏輯的路由。*/default void addViewControllers(ViewControllerRegistry registry) {}/*** 配置視圖解析器,用于將邏輯視圖名稱解析為具體視圖實現(如 JSP、Thymeleaf 等)。*/default void configureViewResolvers(ViewResolverRegistry registry) {}/*** 注冊自定義的方法參數解析器,例如支持額外注解參數等。*/default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}/*** 注冊自定義的返回值處理器,用于處理 controller 返回結果。*/default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}/*** 配置用于請求與響應體轉換的消息轉換器,支持 JSON、XML、表單等格式。*/default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}/*** 擴展默認的消息轉換器配置,例如添加或修改默認行為。*/default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}/*** 配置 Spring MVC 的異常解析器鏈,實現自定義異常響應邏輯。*/default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}/*** 擴展默認的異常解析器配置,可與默認行為組合使用。*/default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}/*** 提供全局校驗器(如 Hibernate Validator),可用于 @Valid 或 @Validated 注解。*/@Nullabledefault Validator getValidator() { return null; }/*** 提供錯誤碼解析器,用于構造國際化校驗消息。*/@Nullabledefault MessageCodesResolver getMessageCodesResolver() { return null; }
}

實戰

@Configuration
public class WebConfig  implements WebMvcConfigurer {}

通過繼承 DelegatingWebMvcConfiguration,可以在不使用 @EnableWebMvc 的情況下以更高級的方式自定義 Spring MVC 配置,包括覆蓋默認的基礎 Bean 并保留對其他 WebMvcConfigurer 實現的支持。

@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {}

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

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

相關文章

Jmeter的元件使用介紹:(四)前置處理器詳解

Jmeter的前置處理器可以用來在取樣器執行前做一些數據準備操作&#xff0c;也需要注意使用的作用域問題。常用的前置處理器有&#xff1a;用戶參數、BeanShell預處理器、JDBC預處理器。一、用戶參數 【用戶參數】與前面介紹過的【用戶定義的變量】有相似之處&#xff0c;先來介…

十七、K8s 可觀測性:全鏈路追蹤

十七、K8s 可觀測性&#xff1a;全鏈路追蹤 文章目錄十七、K8s 可觀測性&#xff1a;全鏈路追蹤1、Skywalking 初識1.1 為什么需要全鏈路追蹤平臺1.2 全鏈路追蹤核心組件及工作原理1.2.1 全鏈路追蹤核心概念1.2.2 全鏈路追蹤工作原理1.3 什么是Skywalking&#xff1f;1.4 Skywa…

2025 Gitee vs. GitLab:全面對比與選擇指南

在軟件研發持續加速、合規要求日益嚴格的背景下&#xff0c;選擇合適的代碼托管平臺成為團隊數字化能力建設的關鍵環節。尤其在中國本土市場&#xff0c;Gitee正憑借其深度本地化能力、全面生態整合和開源社區支撐&#xff0c;成為國內團隊首選的開發協作平臺。 一、Gitee&…

期貨反向跟單忌諱問題(一): 不斷調整盤手交易規則

在期貨反向跟單領域&#xff0c;不少運營者在摸著石頭過河的過程中&#xff0c;容易陷入一個致命誤區——對盤手交易規則的頻繁調整。這種看似“優化策略”的舉動&#xff0c;往往會讓整個跟單體系陷入惡性循環&#xff0c;最終偏離盈利初衷。期貨反向跟單的核心邏輯是&#xf…

Effective C++ 條款07:為多態基類聲明virtual析構函數

Effective C 條款07&#xff1a;為多態基類聲明virtual析構函數核心思想&#xff1a;當通過基類指針刪除派生類對象時&#xff0c;如果基類沒有虛析構函數&#xff0c;會導致派生類資源泄漏。因為此時只會調用基類的析構函數&#xff0c;而不會調用派生類的析構函數。 ?? 1. …

C++進階—C++11

第一章&#xff1a;C11簡介 在2003年C標準委員會曾經提交了一份技術勘誤表(簡稱TC1)&#xff0c;使得C03這個名字已經取代了C98稱為C11之前的最新C標準名稱。不過由于C03(TC1)主要是對C98標準中的漏洞進行修復&#xff0c;語言的核心部分則沒有改動&#xff0c;因此人們習慣性…

把振動數據轉成音頻并播放

把振動數據轉聲音并播放 1、實現流程 安裝第三方庫: pip install numpy==1.23.5 pip install scipy==1.10.1 pip install sounddevice==0.4.6流程: 1、導入振動數據 2、數據歸一化到[-1, 1]范圍 3、重采樣到44.1kHz 4、播放音頻 5、保存音頻為WAV文件(可選)2、代碼示例 …

ServBay 1.15.0 更新,擁抱 Bun Deno 新生態

歷時一個月&#xff0c;ServBay迎來了1.15.0的更新。我們始終堅信&#xff0c;一個優秀的本地開發環境&#xff0c;不僅要穩定、高效&#xff0c;更要緊跟技術的演進脈搏。ServBay 的使命是為開發者掃清開發環境配置的障礙&#xff0c;讓您能聚焦于創造本身。 本次ServBay 1.1…

Java設計模式-通俗舉例

設計模式就像做菜的食譜&#xff0c;告訴我們遇到常見問題時該用什么"烹飪方法"。今天我就用最生活化的例子&#xff0c;帶大家輕松掌握23種設計模式的精髓。一、創建型模式&#xff08;5種&#xff09;&#xff1a;怎么"造東西"1. 單例模式&#xff1a;公…

【跟我學YOLO】YOLO12(3)訓練自己的數據集

歡迎關注『跟我學 YOLO』系列 【跟我學YOLO】&#xff08;1&#xff09;YOLO12&#xff1a;以注意力為中心的物體檢測 【跟我學YOLO】&#xff08;2&#xff09;YOLO12 環境配置與基本應用 【跟我學YOLO】&#xff08;3&#xff09;YOLO12 訓練自己的數據集 【跟我學YOLO】&…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博輿情分析實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博輿情分析實現 視頻在線地址&#xff1…

【C++】手搓一個STL風格的vector容器

TOC(手搓一個STL風格的vector容器) 手搓一個STL風格的vector容器 github地址 有夢想的電信狗 0. 前言&#xff1a;動態數組的工程實踐 ? 在C標準庫中&#xff0c;vector容器作為最核心的序列式容器&#xff0c;其設計融合了動態數組的高效性與安全性。本文將通過完整實現…

24. 了解過 webp 嗎

總結 一種圖片格式 一、什么是 WebP&#xff1f; WebP&#xff08;發音為 “weppy”&#xff09;是由 Google 推出的一種現代圖片格式&#xff0c;支持有損壓縮和無損壓縮&#xff0c;旨在提供更小的文件體積和更高質量的圖像顯示。 它兼容常見的圖片功能&#xff0c;如&#…

【Unity筆記】Unity Camera.cullingMask 使用指南:Layer 精準控制、XR 多視圖與性能提升

Unity Camera.cullingMask 使用指南&#xff1a;Layer 精準控制、XR 多視圖與性能提升 關鍵詞&#xff1a;Unity、Camera、Culling Mask、Layer 控制、XR 渲染分離、UI 顯隱、性能優化 特別說明&#xff1a; 本文為近期項目所遇問題的總結&#xff0c;僅純文字記錄&#xff0c;…

攜帶參數的表單文件上傳 axios, SpringBoot

頁面上的表單如上圖, 點擊確定按鈕需要把參數統一傳給后端.前端代碼:表單的提交方法const submit async () > {const formData new FormData();formData.append("bookName", bookForm.value.bookName);formData.append("author", bookForm.value.auth…

黑馬JavaWeb【復習到哪更新到哪】

登錄認證&#xff08;復習Javaweb的登錄校驗&#xff09; 登錄功能 思路就是loginController->service層->mapper層&#xff0c;從數據庫中查找username和password是否和前端用戶提交的表單內容一致&#xff0c;一致就登錄成功&#xff0c;否則就返回登錄失敗的信息。 登…

NVMe高速傳輸之擺脫XDMA設計21:PCIe請求模塊設計(下)

在接收到請求總線接口的請求事務后&#xff0c;當請求類型的值為0時&#xff0c;表示通過PCIE硬核的配置管理接口發送請求&#xff0c;由于請求接口的接口和時序與配置管理接口基本一致&#xff0c;因此此時直接將請求接口信號驅動到配置管理接口完成請求的發送&#xff0c;請求…

機器學習sklearn:不純度與決策樹構建

不純度與決策樹構建不純度概念&#xff1a;決策樹通過不純度指標來選擇最佳分割節點和分枝方式不純度衡量節點中樣本類別的混雜程度不純度越低&#xff0c;節點中樣本類別越純凈&#xff0c;擬合效果越好常用不純度指標&#xff1a;信息熵(Entropy)&#xff1a;基于信息論的概念…

rk356x IR紅外發射與接收之NEC協議

紅外接收紅外接收頭解碼器&#xff08;紅外信號解碼&#xff0c;主要是NEC解碼&#xff09;紅外發射器紅外發光二極管晶振NEC編碼組成共32位&#xff08;4bit&#xff09;&#xff1a;由8位用戶碼1 8位用戶碼2 8位命令碼 8位命令碼反碼有時會存在按鍵一直按下的一幀信息&…

C++算法之單調棧

C算法中的單調棧&#xff1a;從入門到實戰指南 大家好&#xff01;今天我們來聊聊C算法中一個超級實用的工具——單調棧。別被名字嚇到&#xff0c;它其實很簡單&#xff0c;就像排隊買奶茶一樣&#xff1a;隊伍總是從矮到高&#xff08;或從高到矮&#xff09;排得整整齊齊&a…