@EnableMvc的原理

所以,加了这个注解,就会有一写初始化的操作
@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);
            }
        }
        @Override
        public 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);
            }
        }
        @Override
        public 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,RequestMappingHandlerMapping
    public 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,则包装成MappedInterceptor
                                        this.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中的addCorsMappings
        mapping.setCorsConfigurations(getCorsConfigurations());
        // 其他设置
        return mapping;
    }

    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
        // 创建对象
        RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
        // 设置消息转换器
        // 同时执行所有WebMvcConfigurer的configureMessageConverters和extendMessageConverters
        // 如果没有,根据导包给一些默认的转换器
        adapter.setMessageConverters(getMessageConverters());
        // 设置WebBinder初始化器 ConfigurableWebBindingInitializer
        adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer(conversionService, validator));
        // 设置自定义的参数解析器,同时执行所有WebMvcConfigurer的addArgumentResolvers
        adapter.setCustomArgumentResolvers(getArgumentResolvers());
        // 设置自定义的返回值处理器,同时执行所有WebMvcConfigurer的addReturnValueHandlers
        adapter.setCustomReturnValueHandlers(getReturnValueHandlers());
        // 如果存在json,添加两个JsonViewRequestBodyAdvice,JsonViewResponseBodyAdvice
        if (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.mfbz.cn/a/336521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

介绍几个免费的国内chatgpt网站

概述&#xff1a;水点文章。 第一&#xff1a;chataa网站 chataa (chat778.com) 进去之后注册一下&#xff0c;即可免费使用。 第二&#xff1a;AlchatOS网站 AIchatOS 第三&#xff1a;ChatGPT在线聊天 ChatGPT在线聊天 (zxf7460.cn) 第四&#xff1a;说我真帅&#xff0…

【Python】--- 基础语法(1)

目录 1.变量和表达式2.变量和类型2.1变量是什么2.2变量的语法2.3变量的类型2.3.1整数2.3.2浮点数&#xff08;小数&#xff09;2.3.3字符串2.3.4布尔2.3.5其他 2.4为什么要有这么多类型2.5动态类型特征 3.注释3.1注释的语法3.2注释的规范 结语 1.变量和表达式 对python的学习就…

麒麟V10挂载iso,配置yum源

本文介绍yum 如何挂载本地镜像源 1) 拷贝镜像到本地 2) 执行以下命令&#xff1a; # mount -o loop 镜像路径及镜像名字 /mnt&#xff08;或 media&#xff09; 挂载前 挂载后 3) 进入/etc/yum.repos.d&#xff08;yum.repos.d 是一个目录&#xff0c;该目录是分析 RPM 软件…

kafka(一)——简介

简介 Kafka 是一种分布式、支持分区、多副本的消息中间件&#xff0c;支持发布-订阅模式&#xff0c;多用于实时处理大量数据缓存的场景&#xff0c;类似于一个“缓存池”。 架构 Producer&#xff1a;消息生产者&#xff1b;Consumer&#xff1a;消息消费者&#xff1b;Brok…

【Go】rune和byte类型的认识与使用

【Go】rune和byte类型的认识与使用 大家好 我是寸铁&#x1f44a; 总结了一篇rune和byte类型的认识与使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; byte和rune类型定义 byte,占用1个字节&#xff0c;共8个比特位&#xff0c;所以它实际上和uint8没什么本质区别,它表示…

Windows11开启SSH服务

文章目录 环境背景安装SSH服务配置SSH服务启动/停止SSH服务登录接下来参考 环境 Windows 11 家庭中文版 背景 在我的Windows电脑上&#xff0c;有些网站无法直接访问&#xff0c;所以需要通过Mac来代理。为此&#xff0c;需要创建一个位于Windows和Mac之间的SSH tunnel。 在…

【C++】vector容器接口要点的补充

接口缩容 在VS编译器的模式下&#xff0c;类似于erase和insert接口的函数通常会进行缩容&#xff0c;因此&#xff0c;insert和erase行参中的迭代器可能会失效。下图中以erase为例&#xff1a; 代码如下&#xff1a; #include <iostream> #include <vector> #inclu…

如何本地部署虚VideoReTalking

环境&#xff1a; Win10专业版 VideoReTalking 问题描述&#xff1a; 如何本地部署虚VideoReTalking 解决方案&#xff1a; VideoReTalking是一个强大的开源AI对嘴型工具&#xff0c;它是我目前使用过的AI对嘴型工具中效果最好的一个&#xff01;它是由西安电子科技大学、…

MATLAB聚类工具箱

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;【1】MATLAB聚类工具箱&#xff1a;提前预览工具箱的核心功能_哔哩哔哩_bilibili 关于工具箱的获取&#xff0c;在数学建模学习交流公众号里发送&#xff1a; 567891 %% …

idea 安装免费Ai工具 codeium

目录 概述 ide安装 使用 chat问答 自动写代码 除此外小功能 概述 这已经是我目前用的最好免费的Ai工具了&#xff0c;当然你要是有钱最好还是用点花钱的&#xff0c;比如copilot&#xff0c;他可以在idea全家桶包括vs&#xff0c;还有c/c的vs上运行&#xff0c;还贼强&am…

数据加密-mysql

想要实现数据加密可以在mysql数据库表实现数据加密&#xff0c;来确保数据安全。下面就是加密算法AES_ENCRYPT&#xff0c;其他加密算法类似。 1 创建一张临时表test_table CREATE TABLE test_table (name varchar(20) DEFAULT NULL,id blob ) ENGINEInnoDB DEFAULT CHARSETu…

【JavaEE】_基于UDP实现网络通信

目录 1. 服务器 1.1 实现逻辑 1.2 代码 1.3 部分代码解释 2. 客户端 2.1 实现逻辑 2.2 代码 2.3 客户端部分代码解释 3. 程序运行结果 4. 服务器客户端交互逻辑 此篇内容为实现UDP版本的回显服务器echo server&#xff1b; 普通服务器&#xff1a;收到请求&#xff…

领略指针之妙

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

【高等数学之极限】

一、引言 我们先思考一下&#xff0c;上面三个表达式&#xff0c;是否可以将极限值直接代入求值&#xff0c;我们在计算之前需要先分析一下&#xff0c;如果将极限值代入&#xff0c;那么表达式将会变成什么形式? 经过上面的分析&#xff0c;我们发现第一个式子可以直接带入&a…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

通用人工智能的能力评估框架-Levels of AGI Operationalizing Progress on the Path to AGI

通用人工智能的能力评估框架-Levels of AGI: Operationalizing Progress on the Path to AGI 译自’Levels of AGI: Operationalizing Progress on the Path to AGI’&#xff0c;有所删节.笔者能力有限&#xff0c;敬请勘误。 摘要 Google DeepMind提出一种针对通用人工智能 …

端口映射的定义、特点、场景、实例、常见问题回答(Port Mapping)

目 录 一、端口映射&#xff08;Port Mapping&#xff09; 二、端口映射应用场景&#xff08;什么时候用到端口映射&#xff09; &#xff08;一&#xff09;、使用端口映射的条件 &#xff08;二&#xff09;使用端口映射的具体场景 三、端口映射技术的特点 …

LLM之RAG实战(十七)| 高级RAG:通过使用LlamaIndex重新排序来提高检索效率

基本RAG的检索是静态的&#xff0c;会检索到固定数字&#xff08;k&#xff09;个相关文档&#xff0c;而如果查询需要更多的上下文&#xff08;例如摘要&#xff09;或更少的上下文&#xff0c;该怎么办&#xff1f; 可以通过在以下两个阶段来实现动态检索&#xff1a; 预检索…

Python对Excel文件中不在指定区间内的数据加以去除的方法

本文介绍基于Python语言&#xff0c;读取Excel表格文件&#xff0c;基于我们给定的规则&#xff0c;对其中的数据加以筛选&#xff0c;将不在指定数据范围内的数据剔除&#xff0c;保留符合我们需要的数据的方法。 首先&#xff0c;我们来明确一下本文的具体需求。现有一个Exc…

Centos 7 单机部署 consul

一、下载安装 参考官网文档 Install | Consul | HashiCorp Developer 进入Centos 执行下面命令 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install consul 这种方法安装完成…
最新文章