@EnableMvc的原理

news/2024/4/15 6:40:40
所以,加了这个注解,就会有一写初始化的操作
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
导入了DelegatingWebMvcConfiguration  extends WebMvcConfigurationSupport{// WebMvcConfigurerComposite implements WebMvcConfigurer// WebMvcConfigurerComposite实现了WebMvcConfigurer接口,同时还持有多个List<WebMvcConfigurer>private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();{// WebMvcConfigurer配置相关的类private final List<WebMvcConfigurer> delegates = new ArrayList<>();// 下列方法都是调用当前持有的所有WebMvcConfigurer对应的方法public void addWebMvcConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.delegates.addAll(configurers);}}@Overridepublic void addInterceptors(InterceptorRegistry registry) {for (WebMvcConfigurer delegate : this.delegates) {delegate.addInterceptors(registry);}}public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {for (WebMvcConfigurer delegate : this.delegates) {delegate.configureMessageConverters(converters);}}@Overridepublic void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {for (WebMvcConfigurer delegate : this.delegates) {delegate.addReturnValueHandlers(returnValueHandlers);}}}// WebMvcConfigurerComposite是通过set注入的方式,将Spring容器中WebMvcConfigurer类型的bean都注入@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}// 注入bean,RequestMappingHandlerMappingpublic RequestMappingHandlerMapping requestMappingHandlerMapping(){RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping();mapping.setOrder(0);mapping.setInterceptors(getInterceptors(conversionService, resourceUrlProvider){if (this.interceptors == null) {InterceptorRegistry registry = new InterceptorRegistry();// 执行WebMvcConfigurerComposite的添加拦截器方法addInterceptors(registry);// 注册两个拦截器registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService));registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider));// 将所有拦截器进行遍历,如果有设置了includePatterns或者excludePatterns,则包装成MappedInterceptorthis.interceptors = registry.getInterceptors();{return this.registrations.stream().sorted(INTERCEPTOR_ORDER_COMPARATOR).map(InterceptorRegistration::getInterceptor){if (this.includePatterns == null && this.excludePatterns == null) {return this.interceptor;}MappedInterceptor mappedInterceptor = new MappedInterceptor(StringUtils.toStringArray(this.includePatterns),StringUtils.toStringArray(this.excludePatterns),this.interceptor);if (this.pathMatcher != null) {mappedInterceptor.setPathMatcher(this.pathMatcher);}return mappedInterceptor;}.collect(Collectors.toList());}}return this.interceptors.toArray();});// 设置跨域配置// 执行所有WebMvcConfigurer中的addCorsMappingsmapping.setCorsConfigurations(getCorsConfigurations());// 其他设置return mapping;}@Beanpublic RequestMappingHandlerAdapter requestMappingHandlerAdapter(){// 创建对象RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();// 设置消息转换器// 同时执行所有WebMvcConfigurer的configureMessageConverters和extendMessageConverters// 如果没有,根据导包给一些默认的转换器adapter.setMessageConverters(getMessageConverters());// 设置WebBinder初始化器 ConfigurableWebBindingInitializeradapter.setWebBindingInitializer(getConfigurableWebBindingInitializer(conversionService, validator));// 设置自定义的参数解析器,同时执行所有WebMvcConfigurer的addArgumentResolversadapter.setCustomArgumentResolvers(getArgumentResolvers());// 设置自定义的返回值处理器,同时执行所有WebMvcConfigurer的addReturnValueHandlersadapter.setCustomReturnValueHandlers(getReturnValueHandlers());// 如果存在json,添加两个JsonViewRequestBodyAdvice,JsonViewResponseBodyAdviceif (jackson2Present) {adapter.setRequestBodyAdvice(Collections.singletonList(new JsonViewRequestBodyAdvice()));adapter.setResponseBodyAdvice(Collections.singletonList(new JsonViewResponseBodyAdvice()));}// 添加两个返回异步结果的拦截器adapter.setCallableInterceptors(configurer.getCallableInterceptors());adapter.setDeferredResultInterceptors(configurer.getDeferredResultInterceptors());return adapter;}// 等等等等其他组件,视图解析器,语言解析器,异常解析器
}


http://www.ppmy.cn/news/1326961.html

相关文章

六、Netty核心模块组件

目录 6.1 BootStrap&#xff0c;ServerBootStrap6.2 Future&#xff0c;ChannelFuture6.3 Channel6.4 Selector6.5 ChannelHandler 以及其实现类6.6 Pipeline 和 ChannelPipeline6.7 ChannelHandlerContext6.8 ChannelOption6.9 EventLoopGroup和其实现类 NioEventLoopGroup6.1…

C++大学教程(第九版)5.25去除break语句 5.27去除cintinue语句

5.25题目 (去除break和continue)break和continue 语句遭到质疑的原因是它们的非结构化性。实际上,break和continue 语句总能用结构化的语句取代。请详述如何从程序的一条循环语中去除break语句&#xff0c;并用某种结构化的手段替代。提示:break 语句用于在循环体内离开一个循…

领略指针之妙

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

【MySQL】所有文章传送门【自用】(暂不更新)

目录 1. MySQL 教程2. MySQL 实战项目 1. MySQL 教程 MySQL教程【自用&#xff0c;暂不公开】【数据库——MySQL】&#xff08;1&#xff09;数据库原理与设计【数据库——MySQL】&#xff08;2&#xff09;数据库和表的操作【数据库——MySQL】&#xff08;3&#xff09;对于…

C++参悟:正则表达式库regex(更新中)

正则表达式库regex&#xff08;更新中&#xff09; 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一、概述 C标准库为…

【深度学习】BasicSR训练过程记录

文章目录 两种灵活的使用场景项目结构概览简化的使用方式 项目结构解读1. 代码的入口和训练的准备工作2. data和model的创建2.1 dataloader创建2.2 model的创建 3. 训练过程 动态实例化的历史演进1. If-else判断2. 动态实例化3. REGISTER注册机制 REGISTER注册机制的实现1. DAT…

Jenkins实现CICD(1)_Windows10 安装Jenkins

文章目录 一、打开Jenkins官网&#xff0c;下载安装包二、安装Jenkins三、JAVA环境_JDK17下载安装&#xff08;Windows版&#xff09;四、将jdk-17添加到系统环境变量五、jenkins关联jdk-17六、安装常用插件(例如&#xff1a;git、gitlab、钉钉) 一、打开Jenkins官网&#xff0…

C++从零开始的打怪升级之路(day14)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的内容是string类 这里给上官方的文档链接&#xff0c;…

在线录屏-通过Web API接口轻松实现录屏

在线录屏是指在互联网上进行屏幕录制的过程。它允许用户通过网络连接&#xff0c;将自己的屏幕活动记录下来&#xff0c;并可以在需要时进行播放、共享或存档。在线录屏常用于教育、培训、演示、游戏等场景&#xff0c;可以帮助用户展示操作步骤、解决问题、分享经验等。通常&a…

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…

Wheeltec小车的开发实录(0)

配置静态ip&#xff08;可以联网&#xff09; 首先在你正常链接网络的时候打开“Connection Information”(我的是wifi&#xff0c;而且是手机热点&#xff0c;所以我手机就相当于一台路由器) 查看路由ip 观察到Default Route 是192.168.***.225这就是我手机的地址&#xff0…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …

无法打开浏览器开发者工具的可能解决方法

网页地址: https://jx.xyflv.cc/?url视频地址url 我在抖音里面抓了一个视频地址, 获取到响应的json数据, 找到里面的视频地址信息 这个网站很好用: https://www.jsont.run/ 可以使用js语法对json对象操作, 找到所有视频的url地址 打开网页: https://jx.xyflv.cc/?urlhttps:…

Spring 事件推送publishEvent

Spring 事件推送publishEvent 文章目录 Spring 事件推送publishEvent一、 简介二、 原理 事件模型有三个组成部分&#xff1a;事件源 source&#xff08;被监听对象&#xff09;、事件 event 和监听对象 listener。三、 使用1. 定义事件2. 定义事件源3. 定义监听对象4. 统一发送…

SpringBoot 项目中后端实现跨域的5种方式!!!

文章目录 SpringBoot 项目中后端实现跨域的5种方式&#xff01;&#xff01;&#xff01;一、为什么会出现跨域问题二、什么是跨域三、非同源限制四、Java后端 实现 CORS 跨域请求的方式1、返回新的 CorsFilter(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、使用注解 (局部跨…

SQL Server Management Studio创建数据表

文章目录 一、建表注意事项1.1 数据类型1.2 建立数据表的基本SQL语法 二、实例说明2.1 创建数据表2.2 实例2 三、标识列和主键示例&#xff1a; 一、建表注意事项 1.1 数据类型 可以看这个去了解数据类型&#xff1a; 1.2 建立数据表的基本SQL语法 建立数据表的基本 SQL 语…

C#操作pdf之使用itext实现01-生成一个简单的table

创建.net 8控制台项目 安装itext <PackageReference Include"itext" Version"8.0.2" /><PackageReference Include"itext.bouncy-castle-adapter" Version"8.0.2" /><PackageReference Include"itext.bouncy-cast…

【设计模式-08】Flyweight享元模式

简要说明 简要的理解&#xff1a;享元模式就是新建一个池(Pool)&#xff0c;该池子(Pool)中有新建好的一堆对象&#xff0c;当需要使用时&#xff0c;从池子(Pool)中直接获取&#xff0c;不用重新新建一个对象。通俗的讲就是&#xff1a;共享元数据。 比如Java中的String就是使…

C和指针课后答案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 第八章课后答案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

LabVIEW振动筛螺栓松动故障诊断

LabVIEW振动筛螺栓松动故障诊断 概述&#xff1a;利用LabVIEW解决振动筛螺栓松动的故障诊断问题。通过集成的方法&#xff0c;不仅提高了故障检测的准确性&#xff0c;还优化了维护流程&#xff0c;为类似的机械设备故障提供了可靠的解决方案。 由于工作条件复杂&#xff0c;…
最新文章