[spring6: @EnableWebMvc]-源码分析
源码
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 {}