news 2026/5/20 12:31:25

【Springboot】SpringBoot 整合 SpringMVC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Springboot】SpringBoot 整合 SpringMVC

Spring Boot 与 Spring MVC 的整合并非新增功能,而是 Spring Boot 基于约定大于配置的思想,对 Spring MVC 核心组件实现了开箱即用的自动配置。其本质是通过 spring-boot-starter-web 启动器封装 Spring MVC 核心依赖和自动配置类,让开发者无需手动配置 DispatcherServlet、视图解析器、消息转换器等核心组件,能直接快速使用 Spring MVC 的所有核心能力,同时仍保留完全的自定义扩展能力。

SpringMVC自动管理

在 pom.xml 中引入 spring-boot-starter-web 启动器

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

这个启动器不仅封装了 Spring MVC 核心依赖,还包含了内嵌 Tomcat、JSON 解析、Servlet 等依赖,是自动装配的依赖基础

开启自动装配开关

@SpringBootApplication public class MvcDemoApplication { public static void main(String[] args) { SpringApplication.run(MvcDemoApplication.class, args); } }

启动类上的 @SpringBootApplication 注解包含 @EnableAutoConfiguration 注解,这个注解会触发 Spring Boot 扫描并加载所有预设的自动配置类

Spring Boot 对 Spring MVC 的自动装配核心由 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration 类实现

WebMvcAutoConfiguration 类

这是典型的条件化配置:仅当应用为 Servlet 类型的 Web 应用、项目引入 Spring MVC 核心依赖,且用户未自定义 WebMvcConfigurationSupport 类(即未完全接管 MVC 底层配置)时,该配置类才会生效。且生效时,它会先等待 DispatcherServlet 和参数校验的自动配置类加载完成,再以高优先级加载自身,确保 Spring MVC 核心组件的自动注册安全且有序。

自动装配的核心内容

WebMvcAutoConfiguration 类会自动向 Spring 容器注册 / 初始化 Spring MVC 核心组件,覆盖请求处理全流程

视图解析器

自动整合容器中所有的视图解析器

解析视图:

从容器中获取所有的视图解析器:

静态资源访问

详见【Springboot】热部署和静态资源映射规则

消息转换和格式化

Formatter 格式化器
日期格式化:

添加格式化器:

自己添加的格式化转换器只需放在容器中即可

HttpMessageConverters 消息转化器

从容器中获取所有的 HttpMessageConverters

核心配置项

Spring Boot 提供的核心配置项是简化 Spring MVC 配置的高效捷径。
其本质在于将 Spring MVC 底层繁杂的配置逻辑封装为可直接配置的属性项,开发人员只需根据实际业务场景的需求调整这些配置项的取值,即可快速适配各类业务场景,无需编写复杂的底层配置代码。

举例:把静态资源访问路径从默认的 /** 改成 /static/**,主配置文件 application.yml 中添加如下内容

扩展 Spring MVC

若核心配置项无法满足定制需求,可通过实现 WebMvcConfigurer 接口进行编程式配置。
在 Spring Boot 中,扩展 Spring MVC 的核心是实现 WebMvcConfigurer 接口,作为 Spring 原生提供的功能扩展接口,它支持在保留 Spring Boot 自动配置的前提下,按需定制 Spring MVC 的各类核心功能,如拦截器、静态资源规则、视图解析器等。

WebMvcConfigurer 接口源码如下:

编程式配置扩展 Spring MVC 的核心原则:
配置类上必须加 @Configuration 注解,声明为配置类;
配置类上不能加 @EnableWebMvc 注解(否则会禁用 SpringBoot 的 MVC 自动配置,所有组件需手动配置);
扩展逻辑通过重写 WebMvcConfigurer 的默认方法实现,Spring Boot 会自动识别并整合这些配置。

在容器中注册视图控制器

示例:创建一个 MyMVCConfig 实现 WebMvcConfigurer 接口,实现 addViewControllers 方法,完成通过 /login 访问转发到 success.html 的工作,代码如下:

@Configuration public class MyMVCCofnig implements WebMvcConfigurer{ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/login").setViewName("success"); } }

自定义静态资源路径

@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/my-static/"); }

例如访问 http://localhost:8080/static/test.js ,会映射到 classpath:/my-static/test.js

注册格式化器

注册格式化器用于解决前端日期字符串与后端 Date 类型参数自动绑定问题,当然通过 application.properties 配置方式也可以实现。

@Override public void addFormatters(FormatterRegistry registry) { registry.addFormatter(new Formatter<Date>() { @Override public String print(Date date, Locale locale) { return null; } @Override public Date parse(String s, Locale locale) throws ParseException { return new SimpleDateFormat("yyyy-MM-dd").parse(s); } }); }

举例实现效果:
当前端通过表单 / JSON 传入 {“createTime”: “2025-12-03”},后端 Controller 方法参数为 public void add(@RequestParam Date createTime),Spring 会自动调用上面注册的 Formatter,将 String 类型的 2025-12-03 解析为 Date 对象。

消息转换器扩展fastjson

在 pom.xml 中引入 fastjson

<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>

配置消息转换器

添加 fastjson,Spring 集成 fastjson 处理 JSON 转换的全局配置

@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter fc = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fc.setFastJsonConfig(fastJsonConfig); converters.add(fc); }

当这个配置生效后,Spring MVC 的 JSON 处理会完全交给 fastjson,返回的 JSON 会是格式化后的结构

在实体类上可以继续控制,使用 @JSONField 注解,此注解是对全局配置的局部覆盖

public class User{ @JSONField(format = "yyyy-MM-dd") private Date date; }

指定 date 字段在 JSON 序列化(Java 对象 → JSON 字符串)和反序列化(JSON 字符串 → Java 对象)时的日期格式。

拦截器

创建拦截器

public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("前置拦截"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后置拦截"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("最终拦截"); } }

拦截器注册

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/hello2"); }

addPathPatterns:指定拦截的路径(支持通配符);
excludePathPatterns:指定排除的路径(必须包含静态资源、错误页面等,否则会拦截这些默认资源)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 10:52:51

TypeScript 接口

TypeScript 中的接口&#xff08;Interface&#xff09;详解 接口&#xff08;interface&#xff09; 是 TypeScript 中最常用、最重要的类型定义方式之一&#xff0c;主要用于描述对象的形状&#xff08;shape&#xff09;&#xff0c;定义对象应该具有哪些属性、方法及其类型…

作者头像 李华
网站建设 2026/5/20 10:52:05

揭秘Open-AutoGLM可视化建模:如何3步完成企业级自动化流程搭建

第一章&#xff1a;Open-AutoGLM无代码流程设计概述Open-AutoGLM 是一款面向非技术用户与开发者的可视化流程自动化工具&#xff0c;基于大语言模型驱动的逻辑生成能力&#xff0c;实现无需编写代码即可构建复杂任务流程。通过拖拽式界面与自然语言指令解析&#xff0c;用户可快…

作者头像 李华
网站建设 2026/5/16 15:24:28

Open-AutoGLM指令调度黑科技:如何实现推理速度提升3倍以上?

第一章&#xff1a;Open-AutoGLM指令调度黑科技&#xff1a;实现推理加速的底层逻辑Open-AutoGLM 作为新一代开源大语言模型推理优化框架&#xff0c;其核心突破在于指令级动态调度机制。该机制通过重构计算图中的算子执行顺序&#xff0c;结合硬件感知的负载均衡策略&#xff…

作者头像 李华
网站建设 2026/5/20 10:51:56

Excalidraw Dropbox联动操作指南

Excalidraw 与 Dropbox 联动&#xff1a;打造轻量级可视化协作闭环 在分布式团队成为常态的今天&#xff0c;如何让一次头脑风暴的草图不随浏览器关闭而消失&#xff1f;怎样确保产品、开发、设计三方看到的是同一版架构图&#xff1f;这些问题背后&#xff0c;其实是对“轻量但…

作者头像 李华
网站建设 2026/5/11 12:38:33

Excalidraw OAuth2认证接入流程

Excalidraw OAuth2 认证接入流程 在现代远程协作日益成为常态的背景下&#xff0c;可视化工具早已不再是简单的绘图板&#xff0c;而是团队沟通、产品设计和系统架构讨论的核心载体。Excalidraw 以其独特的手绘风格和极简交互脱颖而出&#xff0c;被广泛用于绘制流程图、线框图…

作者头像 李华