1. WebMvcConfigurer
(轻量级扩展配置)
1.1 简介
WebMvcConfigurer
是 Spring 提供的接口,用于扩展 Spring MVC 的默认行为。它是一种非侵入式的配置方式,可以轻松地进行各种自定义配置,如拦截器、消息转换器、跨域设置等。实现 WebMvcConfigurer
不会影响 Spring Boot 的自动配置,是最常见的扩展方式。
1.2 常用功能
- 自定义拦截器 :通过实现
addInterceptors
方法添加拦截器。 - 自定义消息转换器 :通过
extendMessageConverters
方法扩展消息转换器。 - 跨域配置 :通过
addCorsMappings
来配置跨域资源共享(CORS)。 - 静态资源配置 :通过
addResourceHandlers
自定义静态资源的路径。
1.3 使用场景
WebMvcConfigurer
适合大部分场景,可以满足自定义消息转换器、静态资源映射、拦截器等常见需求,且不会影响 Spring Boot 的自动配置。
2. WebMvcConfigurationSupport
(深度定制配置)
2.1 简介
WebMvcConfigurationSupport
是 Spring MVC 的一个配置基类,通常用于完全接管 Spring MVC 的配置。继承这个类后,Spring Boot 自动配置将被禁用,因此它适用于需要完全控制 Spring MVC 行为的场景。
2.2 常用功能
- 深度定制 Spring MVC 行为:继承该类后,所有 Spring MVC 的配置都需要手动定义,包括视图解析器、消息转换器、拦截器等。
- 完全覆盖 Spring MVC 默认配置:Spring Boot 的自动配置会失效,需要自行配置所有必要的 MVC 组件。
2.3 使用场景
- 需要完全掌控 Spring MVC 行为的复杂场景。
- 当
WebMvcConfigurer
不能满足定制需求时(如需要重写默认的 MVC 配置)。
注意:继承 WebMvcConfigurationSupport
会导致 Spring Boot 的自动配置失效,因此大部分开发中更推荐使用 WebMvcConfigurer
。
3. 示例
通过实现WebMvcConfigurer接口的
extendMessageConverters
方法扩展消息转换器。
自定义消息转换器(日期格式处理):
java
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration // 表明这是一个 Spring 配置类,Spring 容器会自动扫描并加载该配置
public class WebConfig implements WebMvcConfigurer {
/**
* 扩展 Spring MVC 框架的消息转换器
* 这里是通过自定义 Jackson 的 `MappingJackson2HttpMessageConverter` 来处理 JSON 数据
* 并为其设置自定义的日期格式
*
* @param converters Spring MVC 自动传入的消息转换器列表
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 输出日志,提示消息转换器正在被扩展
log.info("扩展消息转换器...");
// 创建一个 JSON 消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 创建一个 ObjectMapper(这是 Jackson 用于将 Java 对象和 JSON 相互转换的工具类)
ObjectMapper objectMapper = new ObjectMapper();
// 设置日期格式为 "yyyy-MM-dd HH:mm:ss",即:2024-10-15 12:34:56
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 将配置好的 ObjectMapper 设置到消息转换器中
converter.setObjectMapper(objectMapper);
// 将自定义的消息转换器添加到转换器列表的最前面
// 这样 Spring MVC 会优先使用这个自定义的转换器
converters.add(0, converter);
}
}
详细解释
-
@Configuration
注解 :该注解表明
WebConfig
是一个配置类,Spring 会在启动时自动加载该类并执行其中的配置逻辑。 -
WebMvcConfigurer
接口 :这是一个用于扩展和自定义 Spring MVC 行为的接口,不会覆盖 Spring 的默认配置。这里实现了
extendMessageConverters
方法,主要是为了自定义消息转换器。 -
extendMessageConverters(List<HttpMessageConverter<?>> converters)
方法:- 这个方法允许在 Spring MVC 的默认消息转换器列表中插入或替换自定义的消息转换器。
converters
参数是 Spring MVC 默认提供的消息转换器列表。
-
MappingJackson2HttpMessageConverter
:这是一个专门用于将 Java 对象转换为 JSON 格式,以及将 JSON 解析为 Java 对象的消息转换器。Spring 默认使用 Jackson 作为 JSON 序列化和反序列化的工具。
-
ObjectMapper
:- Jackson 的核心类,用于配置和执行对象和 JSON 之间的相互转换。
- 在这里通过
setDateFormat
方法设置了全局的日期格式,所有涉及日期的字段都会被转换为yyyy-MM-dd HH:mm:ss
格式。
-
converters.add(0, converter)
:- 该语句将自定义的消息转换器添加到
converters
列表的最前面。这样可以保证 Spring 优先使用我们自定义的转换器来处理请求和响应中的 JSON 数据。
- 该语句将自定义的消息转换器添加到