Springboot整合springmvc的自动装配

Springboot整合springmvc

官方文档链接:https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-spring-mvc

Spring Boot 对 Spring MVC 提供了自动配置支持,核心是通过 spring-boot-starter-web 快速集成,无需手动配置 DispatcherServlet、视图解析器等核心组件。整合的本质是利用 Spring Boot 的自动配置简化配置,同时支持自定义扩展。

Springboot 整合 springmvc 的官网内容如图

Springmvc的自动解管理

Spring Boot 整合 Spring MVC 的核心:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration 自动装配类

视图解析器

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

解析视图:

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

静态资源访问

我的这一篇博客详细讲述了springboot的静态资源映射规则 springboot的热部署和静态资源映射规则

消息转换和格式化

Formatter 格式化器

日期格式化:

添加格式化器:

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

HttpMessageConverters 消息转化器

从容器中获取所有的 HttpMessageConverters

Springboot扩展springmvc

在 Spring Boot 中扩展 Spring MVC 的核心是实现 WebMvcConfigurer 接口,它是 Spring 提供的功能扩展接口,允许我们在不破坏自动配置的前提下,按需定制 SpringMVC 功能(如拦截器、静态资源、视图解析器等)。

核心原则:

必须加 @Configuration 注解,声明为配置类;

绝对不能加 @EnableWebMvc 注解(否则会禁用 SpringBoot 的 MVC 自动配置,所有组件需手动配置);

扩展逻辑通过重写 WebMvcConfigurer 的默认方法实现,Spring Boot 会自动识别并整合这些配置。

WebMvcConfigurer 接口:

在容器中注册视图控制器(请求转发)

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

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

注册格式化器

注册格式化器用来对请求过来的日期格式化的字符串来做定制化,当然通过 application.properties 配置也可以实现。

java 复制代码
@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);
        }
    });
}

消息转换器扩展fastjson

在pom.xml中引入fastjson

xml 复制代码
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.47</version>
</dependency>

配置消息转换器,添加 fastjson

java 复制代码
@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);
}

在实体类上可以继续控制

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

拦截器

创建拦截器

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("最终拦截");
    }
}

拦截器注册

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

addPathPatterns:指定拦截的路径(支持通配符);

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

相关推荐
axng pmje16 分钟前
Java语法进阶
java·开发语言·jvm
uzong21 分钟前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan27 分钟前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv727 分钟前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫30 分钟前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879230 分钟前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本32 分钟前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab42 分钟前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
yaoxin5211231 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯3 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图