在SpringBoot里自定义Spring MVC配置的三种方法

 更新时间:2026年03月21日 14:16:47   作者:希望永不加班  
SpringBoot帮我们自动配好了 MVC 的核心组件,但实际开发中,光用默认配置肯定不够今天就教你 3 种自定义 Spring MVC 配置的方法,从简单到复杂,新手也能一步步跟着做,需要的朋友可以参考下

前言

SpringBoot 帮我们自动配好了 MVC 的核心组件,但实际开发中,光用默认配置肯定不够:

比如想改静态资源路径、加自定义拦截器、换消息转换器、调整请求参数解析规则……这些都需要我们自定义 Spring MVC 配置。

今天就教你 3 种自定义 Spring MVC 配置的方法,从简单到复杂,新手也能一步步跟着做,再也不用对着默认配置束手无策。

先搞懂SpringBoot 里自定义 MVC 配置的“规矩”

SpringBoot 为了不让我们乱改配置,定了一个核心规则:
想要自定义 MVC 配置,必须实现 WebMvcConfigurer 接口(或继承 WebMvcConfigurerAdapter,但 3.x 已废弃),并加上 @Configuration 注解

这个接口里全是默认方法(不用全部实现,按需重写),覆盖了 MVC 配置的所有场景:静态资源、拦截器、消息转换器、视图解析器……

先给个基础模板,所有自定义配置都基于这个结构:

importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
// 标记这是配置类,SpringBoot 启动时会扫描并加载
@Configuration
publicclassCustomWebMvcConfigimplementsWebMvcConfigurer{
// 下面重写需要自定义的方法即可
// 自定义静态资源路径、添加拦截器、配置消息转换器……
}

踩坑提醒:千万别加 @EnableWebMvc 注解!
加了这个注解,SpringBoot 会完全关闭默认的 MVC 自动配置,所有配置都要你自己写(包括 DispatcherServlet、参数解析器这些核心组件),新手大概率会配崩。

最简单的自定义——修改静态资源访问路径

SpringBoot 默认的静态资源路径是 classpath:/static/classpath:/public/classpath:/resources/,比如你在 static 下放个 test.jpg,访问地址是 http://localhost:8080/test.jpg

如果想加自定义路径(比如 classpath:/images/),或者改默认优先级,重写 addResourceHandlers 方法就行:

importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
publicclassCustomWebMvcConfigimplementsWebMvcConfigurer{
// 自定义静态资源配置
@Override
publicvoidaddResourceHandlers(ResourceHandlerRegistry registry){
// 1. 添加自定义静态资源路径:classpath:/images/
// addResourceHandler:前端访问路径前缀
// addResourceLocations:本地资源实际路径
        registry.addResourceHandler("/images/**")// 前端访问 http://localhost:8080/images/xxx.jpg
addResourceLocations("classpath:/images/");// 对应项目里的 src/main/resources/images/
// 2. 覆盖默认静态资源路径(可选,不推荐,保留默认更灵活)
// registry.addResourceHandler("/**")
//         .addResourceLocations("classpath:/my-static/");
}
}

测试:在 src/main/resources/images/ 下放 logo.png,访问 http://localhost:8080/images/logo.png 就能看到图片。

最常用的自定义——添加全局拦截器

开发中经常需要用拦截器做登录校验、接口限流、日志记录,这是自定义 MVC 最核心的场景。

步骤分两步:先写拦截器类,再在 MVC 配置里注册。

第一步:写自定义拦截器

importjakarta.servlet.http.HttpServletRequest;
importjakarta.servlet.http.HttpServletResponse;
importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
// 自定义登录拦截器
publicclassLoginInterceptorimplementsHandlerInterceptor{
// 请求处理前执行(核心逻辑写这里)
@Override
publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{
// 模拟:从请求头获取 token,判断是否登录
String token = request.getHeader("token");
if(token ==null||!"admin123".equals(token)){
// 未登录,返回 401 状态码
            response.setStatus(401);
            response.getWriter().write("未登录,请先登录!");
returnfalse;// 拦截请求,不往下走
}
returntrue;// 放行请求
}
// 请求处理后执行(可选)
@Override
publicvoidpostHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView)throwsException{
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
// 整个请求完成后执行(可选,比如清理资源)
@Override
publicvoidafterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex)throwsException{
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

第二步:在 MVC 配置里注册拦截器

importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
publicclassCustomWebMvcConfigimplementsWebMvcConfigurer{
// 把拦截器注册为 Bean,Spring 才能管理
@Bean
publicLoginInterceptorloginInterceptor(){
returnnewLoginInterceptor();
}
// 注册拦截器,并配置拦截规则
@Override
publicvoidaddInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(loginInterceptor())
.addPathPatterns("/**")// 拦截所有请求
.excludePathPatterns("/login","/hello");// 排除登录、hello 接口(不拦截)
}
}

测试:

  • 访问 http://localhost:8080/hello:不用 token,正常返回(排除拦截);
  • 访问 http://localhost:8080/user/info:不加 token 会返回 401,加 token: admin123 请求头才放行。

进阶自定义——替换/新增消息转换器

Spring MVC 默认用 MappingJackson2HttpMessageConverter 处理 JSON 序列化/反序列化,但有时我们想自定义规则(比如日期格式、空值处理),或者换用 FastJSON 作为转换器。

以“自定义 Jackson 日期格式”为例:

importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.SerializationFeature;
importcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.http.converter.HttpMessageConverter;
importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
importjava.time.LocalDateTime;
importjava.time.format.DateTimeFormatter;
importjava.util.List;
@Configuration
publicclassCustomWebMvcConfigimplementsWebMvcConfigurer{
// 自定义 JSON 消息转换器
@Override
publicvoidconfigureMessageConverters(List<HttpMessageConverter<?>> converters){
// 1. 创建 Jackson 对象映射器,自定义序列化规则
ObjectMapper objectMapper =newObjectMapper();
// 处理 LocalDateTime 日期格式
JavaTimeModule javaTimeModule =newJavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class,
newLocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        objectMapper.registerModule(javaTimeModule);
// 关闭默认的日期序列化(避免转成时间戳)
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 2. 创建自定义的消息转换器
MappingJackson2HttpMessageConverter converter =newMappingJackson2HttpMessageConverter();
        converter.setObjectMapper(objectMapper);
// 3. 把自定义转换器加到列表最前面(优先级最高)
        converters.add(0, converter);
}
}

测试:返回包含 LocalDateTime 类型的对象时,日期会按 yyyy-MM-dd HH:mm:ss 格式显示,而不是默认的时间戳或 ISO 格式。

新手常见问题(避坑清单)

自定义配置不生效?

  • 检查 @Configuration 注解有没有加;
  • 检查配置类是否在主启动类的扫描包下;
  • 别加 @EnableWebMvc(除非你想完全自定义)。

拦截器里注入 Service 为 null?

  • 原因:拦截器不是 Spring 管理的 Bean,直接 new 会导致依赖注入失败;
  • 解决:像上面那样,用 @Bean 注解把拦截器注册为 Spring Bean,再通过方法引用获取。

静态资源访问 404?

最后总结

SpringBoot 里自定义 Spring MVC 配置,核心就 3 点:

  • 检查 addResourceHandlers 里的路径是否写对(classpath:/ 别漏,/** 通配符别少);
  • 别覆盖默认静态资源路径,优先用添加(add)而非替换。
  • 实现 WebMvcConfigurer 接口 + 加 @Configuration
  • 按需重写接口里的方法(静态资源、拦截器、消息转换器等);
  • 别加 @EnableWebMvc,保留 SpringBoot 自动配置的基础。

以上就是在SpringBoot里自定义Spring MVC配置的三种方法的详细内容,更多关于SpringBoot自定义Spring MVC配置的资料请关注脚本之家其它相关文章!

相关文章

  • springboot创建拦截器过程图解

    springboot创建拦截器过程图解

    这篇文章主要介绍了springboot创建拦截器过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java生产者消费者的三种实现方式

    Java生产者消费者的三种实现方式

    这篇文章主要介绍了Java生产者消费者的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java常用工具类库——Hutool的使用简介

    Java常用工具类库——Hutool的使用简介

    这篇文章主要介绍了Java常用工具类库——Hutool的使用简介,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java根据IP地址实现归属地获取

    Java根据IP地址实现归属地获取

    Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣的小伙伴可以了解下
    2025-05-05
  • Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】

    这篇文章主要介绍了Java实现的二叉树常用操作,包括二叉树的前序建树,前中后递归非递归遍历及层序遍历等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • java多线程文件下载器的实现

    java多线程文件下载器的实现

    本文主要介绍了java多线程文件下载器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Spring的基础事务注解@Transactional作用解读

    Spring的基础事务注解@Transactional作用解读

    文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@TransactionalEventListener实现事务事件监听,可在事务提交后执行后续操作,如邮件通知和日志记录,通过合理选择事务相位和异步处理,提升系统可靠性与解耦性
    2025-09-09
  • RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED解决

    RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED

    这篇文章主要为大家介绍了RabbitMq报错reply-code=406 reply-text=PRECONDITION_FAILED分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • java 注解实现一个可配置线程池的方法示例

    java 注解实现一个可配置线程池的方法示例

    这篇文章主要介绍了java 注解实现一个可配置线程池的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Java实现为PDF批量添加图片水印实用指南

    Java实现为PDF批量添加图片水印实用指南

    在数字化办公日益普及的今天,PDF文档作为信息传输和共享的重要载体,其安全性和版权保护变得尤为关键,本文将介绍如何使用Spire.PDF for Java轻松地在Java应用程序中为PDF文档添加图片水印,有需要的可以参考下
    2025-11-11

最新评论