重学SpringBoot3-WebMvcAutoConfiguration类

news/2024/4/19 14:32:13/文章来源:https://blog.csdn.net/u014390502/article/details/136573371

重学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类

上图 WebMvcAutoConfiguration 类在 SpringBoot 中通过条件注解来检测并应用自动配置。

作用

它主要负责以下配置:

  1. DispatcherServlet配置:它自动配置了 Spring MVC 的核心控制器,即DispatcherServlet。这包括将其注册到 Servlet 容器中以及相关的路径映射。

  2. 静态资源处理:它自动配置了静态资源的处理,比如 JavaScript、CSS 和图片等。这涉及到配置资源的位置以及缓存策略。

  3. Web MVC 配置:它自动配置了 Spring MVC 的基本设置,比如 URL 路径匹配、内容协商和视图解析器等。

  4. Message converters:根据classpath中的类,自动配置消息转换器,这对于RESTful应用程序处理JSON或XML数据尤其重要。

  5. 数据验证:如果 classpath 中存在验证器(例如Hibernate Validator),则自动配置数据验证。

  6. 国际化:自动配置消息源,以支持 i18n。

  7. 文件上传:如果相关类(如 MultipartResolver)在classpath中可用,它也会自动配置文件上传的支持。

  8. 异常处理:它自动配置了基础的异常处理,提供了一个默认的错误页面。

自定义配置的三种方式

在 Spring Boot 2.x 及之后的版本中,包括 Spring Boot 3,自动配置主要通过各种 @Configuration 类来完成,其中 WebMvcAutoConfiguration 是处理 Spring MVC 自动配置的关键类。这个类利用 Spring Framework 的条件注解(如 @ConditionalOnWebApplication@ConditionalOnClass@ConditionalOnMissingBean 等),根据应用程序的上下文和类路径的状态来自动配置 Spring MVC。

在 Spring Boot 3 中,如果想自定义 Spring MVC 的行为,通常会采取以下几种方法:

  1. 实现 WebMvcConfigurer 接口:通过创建一个配置类实现 WebMvcConfigurer 接口,并重写其中的方法,你可以自定义 Spring MVC 的配置,如拦截器、资源处理器、消息转换器等。这种方式不会替换掉 Spring Boot 的自动配置,而是在此基础上进行扩展。

    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {// 实现方法以自定义配置
    }
    
  2. 使用 properties 或 yaml 文件:通过在 application.propertiesapplication.yml 文件中设置相关的 Spring MVC 属性,你可以调整 Spring Boot 的自动配置行为。

  3. 使用 @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 包含的组件继续进行介绍。

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

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

相关文章

HTML---表单验证

文章目录 目录 本章目标 一.表单验证概述 二.表单选择器 属性过滤选择器 三.表单验证 表单验证的方法 总结 本章目标 掌握String对象的用法会使用表单选择器的选择页面元素会使用JQuery事件进行表单验证Ajax的概念和作用 一.表单验证概述 前端中的表单验证是在用户提交表…

Vision Transformer结构解析

Vision Transformer结构解析 ViT简介ViT参数量ViT三大模块ViT图像预处理模块——PatchEmbed多层Transformer Encoder模块MLP&#xff08;FFN&#xff09;模块 基本的Transformer模块Vision Transformer类的实现Transformer知识点网络结构计算复杂度对比Transformer的参数量和计…

C#,煎饼排序问题(Pancake Sorting Problem)算法与源代码

1 煎饼排序问题 给定一个未排序的数组&#xff0c;任务是对给定数组进行排序。您只能在阵列上执行以下操作。 翻转&#xff08;arr&#xff0c;i&#xff09;&#xff1a;将数组从0反转为i 示例&#xff1a; 输入&#xff1a;arr[]{23、10、20、11、12、6、7} 输出&#xff1a…

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…

B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。

Hi&#xff0c;我是贝格前端工场&#xff0c;优化升级各类管理系统的界面和体验&#xff0c;是我们核心业务之一&#xff0c;欢迎老铁们评论点赞互动&#xff0c;有需求可以私信我们 一、不要被流于表面的需求描述迷惑。 很多人找我们优化系统界面&#xff0c;对需求总是轻描淡…

springboot整合redis redis连idea

首先是maven项目里pom.xml添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId> </dependency> 然后是application.properties 中增加redis配置 spring.redis.host=lo…

C++ 标准库类型string

C/C总述&#xff1a;Study C/C-CSDN博客 目录 定义和初始化string对象 string的增 使用push_back进行尾插 使用insert插入 使用append函数完成string的拼接 string的删 使用pop_back进行尾删 使用erase删除 string的查 使用find函数正向搜索第一个匹配项 使用rf…

ArcGIS学习(十二)ModelBuilder参数化建模

ArcGIS学习(十二)ModelBuilder参数化建模 1.ModelBuilder应用基础 本任务给大家带来的是ArcGIS中一个非常有意思也很重要的模块一-ModelBuilder。ModelBuilder有什么用呢? 大家设想一下这些场景: 你在做一项复杂研究,使用到ArcGIS中的多个工具和步骤,包括缓冲区分析、空…

【查找算法】插值查找

文章目录 一&#xff1a;插值查找**代码公式&#xff1a;int mid left (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);**1.1 基本概念1.2 基本思想1.3 原理介绍 二&#xff1a;代码实现 一&#xff1a;插值查找 代码公式&#xff1a;int mid left (…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ &#xff1b;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法&#xff1a;向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

Win UI3开发笔记(四)设置主题续2

本机深色主题下设置的背景颜色可以作用于整个对话框&#xff0c;本机浅色模式下设置的背景颜色只作用与下边的部分。 如果本机选深色&#xff0c;程序选浅色&#xff0c;设置为light只对上部分管用&#xff0c;下部分不管用。如图&#xff0c;左边那个hello按钮要看不见了。。…

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

怎么将pom在文件放到src下方

今天在IDEA从git拉取项目的时候&#xff0c;发现pom.xml文件在文件夹src的上方&#xff0c;平时看惯了项目的pom.xml文件在文件夹src的下方&#xff0c;应该怎么去设置呢&#xff1f; 点击设置——>点击Folder Always on Top 即可 参考&#xff1a;http://t.csdnimg.cn/s34…

2024蓝桥杯每日一题(二分)

一、第一题&#xff1a;教室 解题思路&#xff1a;二分差分 对天数进行二分&#xff0c;在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

CSS补充(下),弹性布局(上)

高级选择器 1.兄弟选择器 2.同时满足 div.bg{background-color: red;}p.bg{background-color: green;}spam.bg{background-color: blue;}注&#xff1a;选择器中间没有空格&#xff0c;有明确标识的选择器写在后面 3.各种伪类的应用 3.1作为第几个子元素 选择器:nth-child…

LeetCode 2917.找出数组中的 K-or 值:基础位运算

【LetMeFly】2917.找出数组中的 K-or 值&#xff1a;基础位运算 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-the-k-or-of-an-array/ 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有…

SPSS直接输出三线表

STEP1 下载三线表.stt至安装目录的Looks文件夹 STEP2 在SPSS菜单栏中找到 编辑-选项-透视表 表外观下拉到最底&#xff0c;选择三线表&#xff08;如果第一步没保存对是不会出现的&#xff09;&#xff0c;然后点击确定 效果&#xff1a;

k8s 网络概念与策略控制

一、Kubernetes 基本网络模型 Kubernetes 的容器网络模型可以把它归结为约法三章和四大目标。 1、约法三章 约法三章确保了Kubernetes容器网络模型的基本特性&#xff1a; ① 任意两个 pod 之间可以直接通信&#xff1a;在Kubernetes中&#xff0c;每个 Pod 都被分配了一个…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…

cocos creator 3.7.2使用shader实现图片扫光特效

简介 功能&#xff1a;图片实现扫光效果 引擎&#xff1a;cocos Creator 3.7.2 开发语言&#xff1a;ts 完整版链接 链接https://lengmo714.top/284d90f4.html 效果图 shader代码 // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- pas…