源碼
EnableWebMvc
@EnableWebMvc
是用于啟用 Spring MVC 的注解,它通過導入 DelegatingWebMvcConfiguration
來加載默認的 MVC 配置,同時允許開發者通過實現 WebMvcConfigurer
接口來自定義部分配置;若需更高階的控制,則可直接繼承 WebMvcConfigurationSupport
或 DelegatingWebMvcConfiguration
。
@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 路由函數 |
RequestMappingHandlerMapping | 0 | 映射帶注解的控制器方法請求 |
HandlerMapping (View Controllers) | 1 | 將 URL 路徑直接映射到視圖名稱 |
BeanNameUrlHandlerMapping | 2 | 將 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 配置 |
UrlPathHelper | URL 路徑提取和處理 | 可通過 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 {}