SpringBoot中的WebMvcConfigurationSupport和WebMvcConfigurer

在SpringBoot中可以通过以下两种方式来完成自定义WebMvc的配置:

(1)继承WebMvcConfigurationSupport类

(2)实现WebMvcConfigurer接口

通过这两种方式完成的WebMvc配置存在差异,本文将对此作简单说明与区分。

一.继承WebMvcConfigurationSupport类

1.WebMvcConfigurationSupport是一个用于实现自定义WebMvc配置的类,里面提供了如添加自定义拦截器、消息转换器等方法,同时对于部分方法具有默认实现。

 2.WebMvcConfigurationSupport中很多方法都被打上@Bean注解,这代表这些方法提供的对象将会交给IOC容器管理。但是WebMvcConfigurationSupport这个类却并未被打上@Configuration注解

 因此在使用继承WebMvcConfigurationSupport的方式来完成自定义WebMvc配置时,需要手动给打上@Configuration注解,这样WebMvcConfigurationSupport中的@Bean方法才能生效。

3. SpringBoot对SpringMvc已经做了自动配置。默认情况下,SpringBoot会使用自己的WebMvc配置类WebMvcAutoConfiguration,而该类实现自动配置的关键在于其内部类EnableWebMvcConfiguration

可以看到作为WebMvcAutoConfiguration内部类的EnableWebMvcConfiguration又是DelegatingWebMvcConfiguration这个类的子类,那么我们再到DelegatingWebMvcConfiguration这个类内部看一下

可以看到DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport。

在Spring框架中,我们可以通过继承WebMvcConfigurationSupport类的方式来实现自定义WebMvc配置,而SpringBoot底层正是通过这种方式来完成自己的WebMvc配置。也就是说我们在SpringBoot中,实际上已经在使用SpringBoot为我们提供的,不同于Spring框架默认配置的WebMvc配置。

4.如果自己使用继承WebMvcConfigurationSupport的方式来实现自定义WebMvc配置,则会覆盖SpringBoot提供的WebMvc配置。

(1)我们在SpringBoot的WebMvc配置类WebMvcAutoConfiguration类上可以看到这一行注解:@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})

该注解的意思是:在SpringBoot实现自动装配时,如果IOC容器中不存在类型为WebMvcConfigurationSupport的bean,才会将这个WebMvcAutoConfiguration实例化。

(2)而如果我们使用继承WebMvcConfigurationSupport类的方式来实现自定义WebMvc配置,则在自动装配时,将导致WebMvcAutoConfiguration无法实例化,其内部初始化配置将全部无法实例化,也就是说SpringBoot提供的WebMvc配置失效;取而代之的,我们自己实现的WebMvcAutoConfiguration类将作为全部WebMvc配置的源头。

(3)如果我们采用这种方式实现WebMvc配置,且在子类中只重写自己需要拓展的功能方法,则其他方法将采用WebMvcConfigurationSupport的默认方法,其默认方法有的是空方法,而有的给了默认实现。但需要注意的是,WebMvcConfigurationSupport那些给了默认实现的方法,与SpringBoot的WebMvc配置类WebMvcAutoConfiguration自己实现的方法是不一样的。我们如果继承WebMvcConfigurationSupport,而不重写其方法,那么我们就是在使用Spring提供的WebMvc配置,而不是SpringBoot提供的WebMvc配置。

(4)因此,使用继承WebMvcConfigurationSupport类实现自定义WebMvc配置这种方式的缺点是显而易见的——我们将为了拓展部分WebMvc配置,而抛弃全部SpringBoot已经为我们实现的便捷的WebMvc配置。

二.实现WebMvcConfigurer接口

1.WebMvcConfigurer是一个用于实现自定义WebMvc配置的接口,里面同样提供了如添加自定义拦截器、消息转换器等方法,且都是默认为空实现的方法。

2.使用实现WebMvcConfigurer接口的方式来实现自定义WebMvc配置,并不会覆盖SpringBoot自己实现的配置。

(1)上文提到,只有在IOC中已经有类型为WebMvcConfigurationSupport的bean的时候,SpringBoot的WebMvc配置类WebMvcAutoConfiguration才不会生效。

(2)而如果我们使用实现WebMvcConfigure接口r的方式自定义WebMvc配置,则WebMvcAutoConfiguration可以被实例化,SpringBoot自己配置的WebMvc成功生效。

(3)而如果在实现WebMvcConfigurer接口时,我们自己实现的方法在SpringBoot的WebMvcAutoConfiguration中也被实现了,则会合并而不是覆盖。这说明了实现WebMvcConfigurer接口是一种增量式的配置方式:

当我们实现WebMvcConfigurer接口并重写其中的某个方法时,实际上是在提供额外的配置或定制逻辑,这些配置或逻辑将与SpringBoot的默认配置合并。SpringBoot会先加载其默认的自动配置,然后应用你在WebMvcConfigurer中定义的自定义配置。

3.继承WebMvcConfigurationSupport与实现WebMvcConfigurer是不同的配置逻辑

(1)继承WebMvcConfigurationSupport类是抛弃所有SpringBoot提供的WebMvc配置,全部由自己实现。

(2)实现WebMvcConfigurer接口是在保留SpringBoot提供的WebMvc配置的基础上,添加自己要拓展的配置。

(3)因此,实际开发中更推荐使用实现WebMvcConfigurer接口的方式来完成自定义WebMvc配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678911.html

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

相关文章

Selenium with Python Behave(BDD)

一、简介 Python语言的行为驱动开发,Behavior-driven development,简称BDD. "Behavior-driven development (or BDD) is an agile software development technique that encourages collaboration between developers, QA and non-technical or bu…

顶顶通呼叫中心中间件-区号号码自动加0(mod_cti基于FreeS WITCH)

顶顶通呼叫中心中间件-区号号码自动加0(mod_cti基于FreeSWITCH) 本地区号。如果配置了本地区号,被叫手机号码归属地和本地区号不同会自动加0 一、导入号码归属地 1、下载ccadmin安装包并且把手机号码归宿地解压出来 1、下载ccadmin安装包 Windows版本下载地址&…

小短片创作-理论知识(五)

1、网格体绘制 1.UE5打开Megascan插件的材质混合器,创建混合材质,最多选择3个材质进行混合, 2.通过模式->网格体绘制,进入网格体绘制模式,通过select选择一个平面进行绘制,然后通过paint进行绘制&am…

opencv笔记(13)—— 停车场车位识别

一、所需数据介绍 car1.h5 是训练后保存的模型 class_directionary 是0,1的分类 二、图像数据预处理 对输入图片进行过滤: def select_rgb_white_yellow(self,image): #过滤掉背景lower np.uint8([120, 120, 120])upper np.uint8([255, 255, 255])#…

09、进程和计划任务管理

9.1 查看和控制进程 程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程是在 CPU 及内存中处于动态执行状态的计算机程序。在 Linux操作系统中,每个程序启动后可以创建一个或多个进程。例如,提供 Web 服务的 httpd …

计算机网络学习记录 网络层 Day4(下)

计算机网络学习记录 网络层 Day4 (下) 你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我…

期权懂题库免费!期权开户测试难吗?多少分算合格通过?

今天带你了解期权懂题库免费!期权开户测试难吗?多少分算合格通过?期权开户测试通常要求投资者达到一定的合格分数,以确保他们具备足够的理解和知识来参与期权交易。 期权开户测试难吗? 期权开户测试的难度因人而异&am…

PW1558A规格探秘:为何它是电源系统不可或缺的6A双向保护芯片?

描述 PW1558A 是一款先进的 28V 6A 额定双向负载开关, 提供过载、 短路、 输入电压浪涌、 过大冲击电流和过热保护, 为系统供电。 内置的 24mΩ超低 RDS(ON)电源开关有助于减少正常操作期间的功率损耗。 该设备具有两个输入/输出端口 VBUS1 和 VBUS2&…

LSDFi协议赛道4大稳定币项目,以bitget钱包为例

纵览 LSDfi 生态繁荣的基石,LSD 稳定币赛道全解析 近期有许多建立在流动性质押通证的稳定币借贷协议开始出现在大众眼里,今天文章就要带大家来一一了解这些 LSDfi 协议究竟是如何争夺这块诱人的大饼。 LybraFinanceLSD 它透过抵押stETH/ETH 铸造&#…

二叉树系列题

OJ104:二叉树的最大深度 1.题目 2.注意 这里要用left和right接收递归的结果,如果不接收,直接用递归来比较,会出现效率问题。 3.参考代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* str…

【深入理解计算机系统第3版】补码加法

感觉这部分有点难,所以稍微整理记一下。 抱歉中英混合,来回切换输入法真的很折磨人。 负溢出 正常 正溢出 以4位补码加法为例,理解下表(书中P64) 补码最大值Tmax 2^3 - 1 7, 补码最小值Tmin -2^3 -8 xyz x yz z mod 2^4zU2Tw(z)溢…

[书生·浦语大模型实战营]——Lagent AgentLego 智能体应用搭建实现效果

1.完成 Lagent Web Demo 使用,并在作业中上传截图 使用插件 不使用插件: 2.完成 AgentLego 直接使用部分,并在作业中上传截图 原图 结果 3.完成 AgentLego WebUI 使用,并在作业中上传截图。 4.使用 Lagent 或 AgentLego …

Python数据分析案例46——电力系统异常值监测(自编码器,孤立森林,SVMD)

案例背景 多变量的时间序列的异常值监测一直是方兴未艾的话题,我总能看到不少的同学要做什么时间序列预测,然后做异常值监测,但是很多同学都搞不清楚他们的区别。 这里要简单解释一下,时间序列预测是有监督的模型,而…

使用API有效率地管理Dynadot域名,使用API创建文件夹管理域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

contenteditable实现插入标签的输入框功能(Vue3版)

需求:实现一个简易的函数编辑器 点击参数能够往输入框插入标签点击函数能够往输入框插入文本删除能够把标签整体删除输入的参数能够获取到其携带的信息 插入文本 /*** description 点击函数展示到输入框*/ const getValue ({ item, type }: any) > {// 创建…

计算机网络之crc循环冗余校验、子网划分、rip协议路由转发表、时延计算、香浓定理 奈氏准则、TCP超时重传 RTO

crc循环冗余校验 异或运算 : 相同得0,相异得1 从多项式获取除数 在原数据的末端补0 , 0的个数等于最高次项的阶数 如果最后结果的有效位数较少时,前面应该补0,补到个数与阶位相同 子网划分 子网掩码:用于识别IP地址中的网络号和主机号的…

MySQL数据库整体知识点简述

目录 第一章:数据库系统概述 第二章:信息与数据模型 第3章 关系模型与关系规范化理论 第四章——数据库设计方法 第六-七章——MySQL存储引擎与数据库操作管理 第九章——索引 第10章——视图 第11章——MySQL存储过程与函数 第12章——MySQL 触…

深度解析:ISP代理与住宅代理区别

代理充当用户和互联网之间的中介,提供各种功能以增强安全性、隐私性和可访问性。在众多代理类型中,ISP 和住宅代理脱颖而出,每种代理都具有独特的功能和应用。 了解 ISP 代理 代理ISP,通常称为互联网服务提供商代理,通…

打造高效问答系统:合合信息文档解析工具的应用与实践

官.网地址:合合TextIn - 合合信息旗下OCR云服务产品 LLM(大型语言模型)的应用落地正快速推动着各行各业工作模式的革新。根据埃森哲在2023年发布的研究报告,预计全行业中有40%的工作时间将得到大语言模型的支持与协助。通过引入A…

23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解 一、概念二、适配器模式结构适配器分类核心思想核心角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、概念 适配器模式(别名:包装器) 是一种结构型设计模式 将一个类的接口转换成客户希望的另…