当前位置: 首页 > news >正文

[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.dtcms.com/a/301610.html

相关文章:

  • MySQL 事务和锁
  • Webpack 和 Vite 的关键区别
  • 在Luckfox Lyra(Zero W)上将TF卡格式化为ext4文件系统
  • 人工智能——图像梯度处理、边缘检测、绘制图像轮廓、凸包特征检测
  • 递归查询美国加速-技术演进与行业应用深度解析
  • 2025 环法对决,VELO Angel Glide 坐垫轻装上阵
  • 【AI论文】GR-3技术报告
  • 《频率之光:危机降临》
  • 详细解释一个ros的CMakeLists.txt文件
  • tpms传感器的设计---硬件电路
  • python中的容器和对象
  • 深入理解SmolVLA中的Flow Matching Action Expert:从理论到实现
  • 从0到1学Pandas(九):Pandas 高级数据结构与操作
  • Adobe Animate中文版 v2024.24.0.10.14
  • 洛谷 装箱问题 动态规划-变形背包问题
  • OpenCL study - code03 rgb2gray
  • 进度条制作--Linux知识的小应用
  • 电商平台中,订单未支付过期,如何实现自动关单?
  • 字节前端面试知识点总结
  • 使用GIS中基于森林的分类与回归模型来估算房屋价值
  • c++17--std::variant
  • 决策树算法小结(上)
  • cmake入门学习
  • HCIE学习之路:路由引入
  • 嵌入式硬件篇---ESP32拓展板
  • C语言中 %zu 的用法
  • Javascript中的instanceof
  • VMware Workstation Pro虚拟机的下载和安装图文保姆级教程(附下载链接)
  • 点云的协方差矩阵的三个特征值代表什么?
  • 5.7 多处理器的基本概念 (答案见原书 P278)