源码

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…