重学SpringBoot3-WebMvcAutoConfiguration类
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍
重学SpringBoot3-WebMvcAutoConfiguration类
- 是什么
- 什么用
- 生效条件
- 作用
- 自定义配置的三种方式
- 自定义配置举例
- 1. 自定义 DispatcherServlet 配置
- 2. 静态资源配置
- 3. 自定义MVC配置
- 4. 消息转换器
- 5. 异常处理
是什么
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
SpringBoot3 的 Web 开发能力,由 SpringMVC 提供,而 WebMvcAutoConfiguration 类是 SpringBoot 自动配置机制的一部分,专门用于配置 Spring MVC 的。这个类在 SpringBoot 应用程序中起着非常重要的作用,下面来看看它的详细作用。
什么用
生效条件
@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) // 在这些自动配置之后
@ConditionalOnWebApplication(type = Type.SERVLET) // 如果是web应用就生效
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) // 导入了这些类才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) // 容器中没有这个Bean
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@ImportRuntimeHints(WebResourcesRuntimeHints.class)
public class WebMvcAutoConfiguration {//
}

上图 WebMvcAutoConfiguration 类在 SpringBoot 中通过条件注解来检测并应用自动配置。
作用
它主要负责以下配置:
-
DispatcherServlet配置:它自动配置了 Spring MVC 的核心控制器,即
DispatcherServlet。这包括将其注册到 Servlet 容器中以及相关的路径映射。 -
静态资源处理:它自动配置了静态资源的处理,比如 JavaScript、CSS 和图片等。这涉及到配置资源的位置以及缓存策略。
-
Web MVC 配置:它自动配置了 Spring MVC 的基本设置,比如 URL 路径匹配、内容协商和视图解析器等。
-
Message converters:根据classpath中的类,自动配置消息转换器,这对于RESTful应用程序处理JSON或XML数据尤其重要。
-
数据验证:如果 classpath 中存在验证器(例如Hibernate Validator),则自动配置数据验证。
-
国际化:自动配置消息源,以支持 i18n。
-
文件上传:如果相关类(如
MultipartResolver)在classpath中可用,它也会自动配置文件上传的支持。 -
异常处理:它自动配置了基础的异常处理,提供了一个默认的错误页面。
自定义配置的三种方式
在 Spring Boot 2.x 及之后的版本中,包括 Spring Boot 3,自动配置主要通过各种 @Configuration 类来完成,其中 WebMvcAutoConfiguration 是处理 Spring MVC 自动配置的关键类。这个类利用 Spring Framework 的条件注解(如 @ConditionalOnWebApplication、@ConditionalOnClass、@ConditionalOnMissingBean 等),根据应用程序的上下文和类路径的状态来自动配置 Spring MVC。
在 Spring Boot 3 中,如果想自定义 Spring MVC 的行为,通常会采取以下几种方法:
-
实现 WebMvcConfigurer 接口:通过创建一个配置类实现
WebMvcConfigurer接口,并重写其中的方法,你可以自定义 Spring MVC 的配置,如拦截器、资源处理器、消息转换器等。这种方式不会替换掉 Spring Boot 的自动配置,而是在此基础上进行扩展。@Configuration public class MyMvcConfig implements WebMvcConfigurer {// 实现方法以自定义配置 } -
使用 properties 或 yaml 文件:通过在
application.properties或application.yml文件中设置相关的 Spring MVC 属性,你可以调整 Spring Boot 的自动配置行为。 -
使用 @EnableWebMvc:如果你添加
@EnableWebMvc注解到你的配置类上,这将完全接管 Spring MVC 的配置,禁用 Spring Boot 的 MVC 自动配置。这种方式适用于需要完全控制 Spring MVC 配置的场景,但请注意,这样做意味着你需要手动配置 Spring MVC 需要的所有组件。
自定义配置举例
SpringBoot3 的自动配置尝试提供合理的默认配置,同时留下足够的灵活性,允许开发人员根据需要覆盖或扩展特定的配置。注意,如果你提供了自己的配置(比如自定义的DispatcherServlet、特定的WebMvcConfigurer实现等),Spring Boot的自动配置将适当地后退,允许使用你的自定义设置。
这只是 WebMvcAutoConfiguration 类的一个高层次概述。具体配置和细节可能会根据你的具体需求和 SpringBoot 的版本有所不同。下面继续深入了解WebMvcAutoConfiguration类在 SpringBoot3 中的作用,我们可以探讨一些具体的自动配置实例和细节。
1. 自定义 DispatcherServlet 配置
在Spring Boot中,DispatcherServlet 是自动配置的,但如果你想要自定义配置,比如修改默认的servlet映射(默认是"/"),你可以通过定义自己的ServletRegistrationBean 来实现。例如:
@Bean
public ServletRegistrationBean<DispatcherServlet> dispatcherServlet() {ServletRegistrationBean<DispatcherServlet> reg = new ServletRegistrationBean<>(new DispatcherServlet(), "/myapp/*");reg.setName("myDispatcherServlet");return reg;
}
2. 静态资源配置
SpringBoot 自动为静态资源服务提供了配置,默认情况下,它们可以从 /static、/public、/resources和/META-INF/resources目录下被访问,见 org.springframework.boot.autoconfigure.web.WebProperties.Resources
public static class Resources {private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };}
但是,如果你需要修改这些默认设置或添加自定义缓存控制,你可以通过实现 WebMvcConfigurer 接口并重写相应的方法来实现,例如:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/my-resources/**").addResourceLocations("classpath:/my-resources/").setCachePeriod(3600);}
}
当然也可以通过配置文件修改:
# 自定义多个静态资源文件夹位置
spring.web.resources.static-locations=classpath:/a/,classpath:/b/,classpath:/static/
#设置缓存
spring.web.resources.cache.period=3600
3. 自定义MVC配置
SpringBoot 允许通过实现 WebMvcConfigurer接口来自定义各种MVC设置。这包括拦截器、跨域请求处理、路径匹配配置等。例如,添加一个简单的拦截器可以如下实现:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyCustomInterceptor());}
}
4. 消息转换器
如果你需要添加或定制消息转换器,通过实现 WebMvcConfigurer 接口,并重写 configureMessageConverters 方法来添加或修改默认的消息转换器。这对于 REST API 开发尤其重要,你可能需要自定义 JSON 或 XML 的序列化和反序列化过程:
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 这里可以添加自定义的消息转换器// converters.add(new MyCustomMessageConverter());// 注意:如果你添加自己的转换器,确保不要调用默认转换器,除非你确实需要它们。// 调用 super.configureMessageConverters(converters) 会添加默认的转换器。}
}
5. 异常处理
虽然 SpringBoot 提供了默认的错误处理,但你可以通过注册 ErrorController 或 @ControllerAdvice 来自定义错误响应。例如,可以创建一个用于捕获特定异常的 @ControllerAdvice:
@ControllerAdvice
public class MyGlobalExceptionHandler {@ExceptionHandler(value = MyCustomException.class)public ResponseEntity<Object> handleCustomException(MyCustomException ex, WebRequest request) {// 处理异常return new ResponseEntity<>(...);}
}
以上示例展示了如何在 SpringBoot 中自定义和扩展 WebMVC 的各个方面。记住,尽管 SpringBoot 提供了许多默认的配置和自动化支持,但它也设计有足够的灵活性,允许开发者根据具体需求进行定制和优化。
这次先到这里,后续会对 SpringMVC 包含的组件继续进行介绍。
相关文章:
重学SpringBoot3-WebMvcAutoConfiguration类
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-WebMvcAutoConfiguration类 是什么什么用生效条件作用 自定义配置的三种方式自定义配置举例1. 自定义 DispatcherServlet 配置2. 静态资源配置3. 自定义…...
探索数据结构:深入了解顺序表的奥秘
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元…...
苍穹外卖学习-----2024/03/010---redis,店铺营业状态设置
1.Redis入门 2.在Java中操作Redis 3.店铺营业状态设置 BUG!!! 今天在启动项目时,用到了Redis缓存数据库,但是却出现了报错信息: ERR Client sent AUTH, but no password is set。Caused by: io.lettuce.core.RedisCommandExecutionException…...
RUST 每日一省:发布到crates.io
github是开源代码分享的地方,rust的开源项目除了github,我们还可以将其发布到 crates.io 上,然后其它用户就可以使用cargo进行安装使用了。其实步骤很简单,只有三条命令了,我们一次来看一下。 1、cargo package 首先&a…...
String类及其常用方法
文章目录 1.String类的特性与使用1.1 String类的特性1.2 String对象的创建方式1.3 String 的使用(不同的拼接操作) 2.String常用方法2.1 String的常用方法一2.2 String常用方法二2.3 String常用方法三 1.String类的特性与使用 1.1 String类的特性 Stri…...
1094. 拼车
说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不…...
Docker进阶:深入了解容器数据卷
Docker进阶:深入了解容器数据卷 一、前言二、容器数据卷的作用三、容器数据卷的使用方法四、实战--使用docker部署前端项目(数据卷挂载)4.1 重要:准备工作,先在本地创建挂载目录4.2 启动一个临时的nginx容器࿰…...
升级版本彻底解决bootstrap-table-fixed-columns固定列后行对不齐问题
升级到bootstrap-table和bootstrap-table-fixed-columns版本都升级到v1.22.3版本以上,即可解决该问题 bootstrap-table:bootstrap-table/dist/bootstrap-table.min.css at develop wenzhixin/bootstrap-table GitHub bootstrap-table-fixed-columns&…...
打破边界:深入探索STUN在实现无缝NAT穿越和WebRTC通信中的核心作用
引言 STUN是一个网络协议,设计用于帮助在网络地址转换(NAT)后面的设备发现其公网地址和端口号。通过允许这些设备发现自己从外部看到的地址,STUN使得它们能够在NAT或防火墙背后建立端到端的通信,这对于VoIP、视频会议…...
浅谈 前端的动态绑定属性
目录 前言1. 基本知识2. Demo 前言 作为Java开发者,从开发转到全栈,前端好些细节都需要科普,这不就来个动态绑定属性 起因是这个: <uni-tr> <uni-td align"center" :rowspan"checkTypesCount 1"…...
Sklearn支持向量机
支持向量机(Support Vector Machine, SVM)是一种常用的分类算法,它可以用于解决二分类和多分类问题。在Python中,你可以使用Sklearn库来实现SVM。下面是一个简单的例子,展示了如何使用Sklearn进行SVM分类。 # 导入必要…...
【Lazy ORM】 小工具 acw 本地客户端 你负责点击页面,他负责输出代码
介绍 wu-smart-acw-client 简称acw-client,是一个基于Lazy ORM定制的客户端代码生成小工具 Lazy ORM 小工具 acw 本地客户端 你负责点击页面,他负责输出代码安装 <dependency><groupId>top.wu2020</groupId><artifactId>wu-sma…...
《详解:鸿蒙NEXT开发核心技术》
我们现在都知道鸿蒙作为一个国产的全栈自研系统,经过国家主推后。已经引起人们很大的关注,其中作为开发者来说;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了,目前了解到已经有200家。而之后出现了很多的高薪鸿蒙开发岗位&am…...
快速排序 刷题笔记
思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…...
DAY by DAY 史上最全的Linux常用命令汇总----man
man是按照手册的章节号的顺序进行搜索的。 man设置了如下的功能键: 功能键 功能 空格键 显示手册页的下一屏 Enter键 一次滚动手册页的一行 b 回滚一屏 f 前滚一屏 q 退出man命令 h 列出所有功能键 /word 搜索word字符串 注意:…...
十六、接口隔离原则、反射、依赖注入
接口隔离原则、反射、特性、依赖注入 接口隔离原则 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 五种原则当中的i 上一章中的接口,即契约。 契约就是在说两件事,甲方说自己不会多要,乙方会在…...
Docker 进阶
1、容器数据卷 什么是容器数据卷? 就是当容器内存在了mysql,在里面书写了数据,如果容器删除了,那么数据也就没有了,通过容器数据卷的技术,可以让容器内的数据持久化到Linux服务器上 操作 #docker run -…...
科研学习|论文解读——一种修正评分偏差并精细聚类中心的协同过滤推荐算法
知网链接 一种修正评分偏差并精细聚类中心的协同过滤推荐算法 - 中国知网 (cnki.net) 摘要 协同过滤作为国内外学者普遍关注的推荐算法之一,受评分失真和数据稀疏等问题影响,算法推荐效果不尽如人意。为解决上述问题,本文提出了一种改进的聚类…...
云计算项目十一:构建完整的日志分析平台
检查k8s集群环境,master主机操作,确定是ready 启动harbor [rootharbor ~]# cd /usr/local/harbor [rootharbor harbor]# /usr/local/bin/docker-compose up -d 检查head插件是否启动,如果没有,需要启动 [rootes-0001 ~]# system…...
2.经典项目-海量用户即使通讯系统
1.实现功能-完成注册用户 完成用户注册的步骤(客户端) 1.将User移动到common/message文件夹下 2.在message中新增注册用户的结构体 const (LoginMesType "LoginMes"LoginResMesType "LoginResMes"RegisterMesType "RegisterMes"…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
