当前位置: 首页 > news >正文

SpringBoot -- 整合SpringMVC

SpringBoot已经替我们整合了许多框架并进行了默认的配置,我们只需要在依赖中导入spring-boot-starter-web,就可以直接使用SpringMVC以及web场景下的已经整合好的功能。但SpringBoot的默认配置可能无法满足我们所有的需求,那么我们怎么进行自定义修改呢?

1. 自动配置

SpringBoot的自动配置机制已经在这篇文章中进行了介绍。这里只进行简单说明。

  • 我们在依赖库中导入spring-boot-starter-web
  • spring-boot-starter-web会引入spring-boot-autoconfigure,其中包含了所有场景的所有配置类
  • 主程序中包含注解@EnableAutoConfiguration,它会通过@Import(AutoConfigurationImportSelector.class)批量导入配置类
  • 配置类根据条件注解以及属性绑定,将组件都加入到容器中

自动配置的默认效果为:

  • 包含了 ContentNegotiatingViewResolver 和 BeanNameViewResolver 组件,方便视图解析
  • 默认的静态资源处理机制: 静态资源放在 static 文件夹下即可直接访问
  • 自动注册了 Converter,GenericConverter,Formatter组件,适配常见数据类型转换和格式化需求
  • 支持 HttpMessageConverters,可以方便返回json等数据类型
  • 注册 MessageCodesResolver,方便国际化及错误消息处理
  • 支持 静态 index.html
  • 自动使用ConfigurableWebBindingInitializer,实现消息处理、数据绑定、类型转化、数据校验等功能

2. 使用方式

SpringBoot 已经默认配置好了Web开发场景常用功能。我们有三种使用他们的方式:

2.1 直接使用

我们全部使用自动配置的默认效果,直接可以开始编写业务代码。

2.2 自定义修改部分功能

我们可以保留自动配置的效果,在自动配置的基础上手动设置部分功能,定义MVC底层组件。

2.3 完全手动设置

禁用自动配置效果。我们对所有配置都手动进行设置。

显然,我们大多数都会选择第二种方式。在自动配置的基础上,进行部分的修改和添加,这样可以很好的实现我们的需求,工作量也不会很大。

我们只需要给容器中写一个配置类@Configuration实现 WebMvcConfigurer但是不要标注 @EnableWebMvc注解。

3. @EnableWebMvc

为什么第二种方式不可以标注 @EnableWebMvc注解, @EnableWebMvc有什么效果呢?

@EnableWebMvc可以禁用默认行为,其原因如下:

  • @EnableWebMvc给容器中导入 DelegatingWebMvcConfiguration组件,而 DelegatingWebMvcConfiguration是继承了WebMvcConfigurationSupport,因此这也意味着容器中存在了WebMvcConfigurationSupport类型的组件
  • WebMvcAutoConfiguration有一个核心的条件注解, @ConditionalOnMissingBean(WebMvcConfigurationSupport.class),也就是说只有容器中没有WebMvcConfigurationSupport类型的组件,WebMvcAutoConfiguration才生效
  • 因此,@EnableWebMvc 导入 WebMvcConfigurationSupport 导致 WebMvcAutoConfiguration 失效,最终效果就是禁用了默认行为

相关文章:

SpringBoot -- 整合SpringMVC

SpringBoot已经替我们整合了许多框架并进行了默认的配置,我们只需要在依赖中导入spring-boot-starter-web,就可以直接使用SpringMVC以及web场景下的已经整合好的功能。但SpringBoot的默认配置可能无法满足我们所有的需求,那么我们怎么进行自定…...

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…...

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…...

服务器大请求体问题定位

背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

Vue指令之v-model

调了半天没反应&#xff0c;结果是没引用Vue&#xff0c;我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下&#xff0c;Vue是数据驱动的&#xff0c;即数据发生改变后网页就会刷新一次&#xff0c;更改对应的网页内容&#xff0c;即数据单向绑定了网页内容。而使用…...

信息系统项目管理师——第11章项目成本管理(重要)

选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考&#xff0c;需要完全掌握。 选择题大概考3分左右&#xff0c;理论和计算都会考。 案例题&#xff0c;必考内容&#xff0c;挣值相关的计算&#xff0c;必须得会。 论文题&#xff0c;考的比较多&#xff0c;…...

SpringMVC常见面试题

1&#xff1a;Spring mvc执行流程 回答&#xff1a; 版本1&#xff1a;视图版本&#xff0c;jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器&#xff0c;生成处理器对象及处理器拦…...

golang 和java对比

Golang&#xff08;又称Go&#xff09;和Java都是目前非常流行的编程语言&#xff0c;但它们有着不同的设计哲学和用途。在本文中&#xff0c;我们将对Golang和Java进行比较&#xff0c;从以下几个方面进行评估&#xff1a;语言特性、性能、并发性能、生态系统和使用场景。 一…...

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask&#xff0c;这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况&#xff0c;一般在线会议投屏&#xff0c;总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力&#xff0c;可以在电脑端直接控制手机&#xff0c;同步起来非常方便简单 打开步骤 …...

.Net Web窗口页属性

<%Page %> Page 指令定义 Web 窗体使用的属性&#xff0c;这些属性将被 Web 窗体页分析器和编译器使用。只能包含在 .aspx 文件中。我们每新建一个 Web 页面时&#xff0c;系统会自动为该 Web 页面头部创建一个 Page 指令&#xff0c;来指明页面最基本的属性。 Langu…...

渐变色x轴换行柱状图

// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …...

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…...

Mysql中的那些锁

表锁和行锁 表锁&#xff1a;一锁锁整张表&#xff0c;mysql中锁定颗粒度最大的一种&#xff0c;针对非索引字段加的锁。MyISAM和InnoDb都支持。 行锁&#xff1a;一锁只锁整行&#xff0c;锁定颗粒度最小&#xff0c;针对索引字段加的锁。MyISAM不支持&#xff0c;InnoDb支持…...

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…...

程序员开发技术整理(持续整理中)

前端技术&#xff1a; vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件 C#后端技术&#xff1a; webservice&#xff1a;soap架构&#xff1a;简单的通信协议&#xff0c;用于服务通信ORM框架&#xff1a;对象关系映射&#xff0c;如EF&#xff1a;对象实体…...

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xff0c;…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…...

更新一条SQL的执行流程

在 MySQL中&#xff0c;条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句&#xff0c;并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后&#xff0c;先进行语法…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...