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:指定排除的路径(必须包含静态资源、错误页面等,否则会拦截这些默认资源);