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配置。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】单页应用程序介绍

通常基于Vue去开发一整个网站,开发出来的这整个网站应用,我们都会叫做单页应用程序 概念 单页应用程序:SPA【Single Page Application】是指所有的功能都在一个html页面上实现 我们可以将页面共用的部分封装成组件,底下要切换的也…

工具-金舟投屏软件: 手机如何投屏到电脑上 / Wi-Fi / USB

金舟安卓/iOS苹果投屏-正版软件下载中心 方法一、金舟投屏软件-wifi 1.1、准备工作 确保苹果手机和Windows电脑都连接到同一个Wi-Fi网络。 在Windows电脑上安装并打开金舟投屏软件。 1.2、操作步骤 在金舟投屏软件上选择“苹果手机投屏”功能。 在苹果手机上下滑屏幕&am…

New Work-flow of Circuit Bootstrapping

参考文献: [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途?2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途? Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征,例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中,我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40,今天,这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中,标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

记录汇川:红绿灯与HMI-ST

项目要求: 子程序: 子程序: 实际动作如下: 红绿灯与HMI-ST

STM32项目分享:智能门禁锁系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码: import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

【Vue】组件化开发

文章目录 一、介绍二、根组件 App.vue 一、介绍 组件化:一个页面可以拆分成一个个组件,每个组件有着自己独立的结构、样式、行为。 好处:便于维护,利于复用 → 提升开发效率。 组件分类:普通组件、根组件。 根组件…

MySQL 高级 - 第十一章 | 索引优化与查询优化

目录 第十一章 索引优化与查询优化11.1 数据准备11.2 索引失效案例11.2.1 全值匹配10.2.2 最佳左前缀法则10.2.3 主键插入顺序10.2.4 计算、函数、类型转换&#xff08;自动或手动&#xff09;导致索引失效10.2.5 范围条件右边的列索引失效10.2.6 不等于&#xff08;! 或者 <…

删除目录

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 删除目录可以通过使用os模块提供的rmdir()函数实现。通过rmdir()函数删除目录时&#xff0c;只有当要删除的目录为空时才起作用。rmdir()函数的基本语…

牛客java基础(一)

A 解析 : java源程序只允许一个public类存在 &#xff0c;且与文件名同名 ; D hashCode方法本质就是一个哈希函数&#xff0c;这是Object类的作者说明的。Object类的作者在注释的最后一段的括号中写道&#xff1a;将对象的地址值映射为integer类型的哈希值。但hashCode()并不…

Linux性能优化实战

Linux性能优化实战 33 | 关于 Linux 网络&#xff0c;你必须知道这些&#xff08;上&#xff09;如何提高系统并发&#xff1f;&#xff08;8条&#xff09;如何理解分布式&#xff1f;如何理解云计算&#xff1f;如何理解微服务&#xff1f;TCP/IP 网络栈如何分层&#xff1f;…

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…

SSM整合总结

一.核心问题 (一)两个容器 web容器 web相关组件&#xff08;controller,springmvc核心组件&#xff09; root容器 业务和持久层相关组件&#xff08;service,aop,tx,dataSource,mybatis,mapper等&#xff09; 父容器&#xff1a;root容器&#xff0c;盛放service、mapper、…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

Java和Web前端哪个有发展前景?

Java和Web前端都是当今技术行业里的热门岗位&#xff0c;岗位招聘需求量大&#xff0c;人才竞争度高&#xff0c;同学们掌握这两个岗位里其中任何一个的相关主流技术&#xff0c;都可以找到一份不错的职位。下面请允许笔者做一个简要的分析阐述&#xff1a; 一、Web前端 Web前…

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…

网络空间安全数学基础·多项式环与有限域

5.1 多项式环&#xff08;掌握&#xff09; 5.2 多项式剩余类环&#xff08;理解&#xff09; 5.3 有限域&#xff08;熟练&#xff09; 5.1 多项式环 定义&#xff1a;设F是一个域&#xff0c;称是F上的一元多项式&#xff0e; 首项&#xff1a;如果an≠0&#xff0c;则称 a…

CAD二次开发(8)-探索实现不重启CAD进行热部署代码

最近在研究CAD二次开发过程中&#xff0c;调试代码的过程中&#xff0c;需要频繁地重启CAD&#xff0c;非常浪费我们的开发时间&#xff0c;所以我就一直在想&#xff0c;怎么可以实现在不每次重启代码和CAD的情况下&#xff0c;实现代码的热部署效果。 我找到的方式&#xff…