WebMvcConfigurer配置接口详解
在 Spring MVC 中,WebMvcConfigurer
是一个核心配置接口,用于自定义和扩展 Spring MVC 的默认行为。它提供了一系列回调方法,允许开发者在不重写完整 MVC 配置类的前提下,灵活添加或修改 MVC 相关的组件(如拦截器、视图解析器、静态资源处理器等)。
一、核心定位:MVC 配置的“扩展点”
Spring MVC 的自动配置(如 WebMvcAutoConfiguration
)会默认注册一些基础组件(如 InternalResourceViewResolver
视图解析器、静态资源处理器等)。但实际开发中,我们常需要根据业务需求调整这些配置(例如添加拦截器、修改视图前缀、自定义参数解析器等)。
WebMvcConfigurer
接口的作用就是提供这些自定义扩展的入口,开发者只需实现该接口并覆盖需要的方法,即可将自定义配置与 Spring MVC 的默认配置融合,避免重复造轮子。
二、核心方法与典型配置场景
WebMvcConfigurer
接口定义了多个方法(Spring 5.0+ 后支持 Java 8 默认方法,只需覆盖需要的方法),以下是最常用的几类配置场景及对应方法:
1. 配置视图解析器(View Resolver)
用于定义如何将逻辑视图名(如 "user"
)转换为物理视图(如 JSP、Thymeleaf 模板)。
方法:void configureViewResolvers(ViewResolverRegistry registry)
示例(配置 Thymeleaf 视图解析器):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 配置 Thymeleaf 视图解析器(假设已引入 Thymeleaf 依赖)
registry.thymeleaf();
// 或自定义 InternalResourceViewResolver(JSP 场景)
// registry.jsp("/WEB-INF/views/", ".jsp");
}
}
2. 添加拦截器(Interceptor)
用于全局拦截请求,实现权限校验、日志记录、参数预处理等功能。
方法:void addInterceptors(InterceptorRegistry registry)
示例(添加登录拦截器):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor; // 自定义拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器,并指定拦截路径和排除路径
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns( // 排除无需拦截的路径
"/login",
"/register",
"/static/**" // 静态资源
);
}
}
3. 配置静态资源处理
用于定义静态资源(如 CSS、JS、图片)的访问路径和缓存策略。
方法:void addResourceHandlers(ResourceHandlerRegistry registry)
示例(配置静态资源映射):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 将 /static/** 映射到 classpath:/static/ 目录
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCachePeriod(3600); // 缓存 1 小时(秒)
// 支持 Swagger UI 资源(前后端分离项目常用)
registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
.resourceChain(false);
}
}
4. 自定义参数解析器(Argument Resolver)
用于处理请求参数的自定义解析逻辑(如将请求参数转换为特定对象)。
方法:void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
示例(自定义用户信息参数解析器):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private CurrentUserArgumentResolver currentUserResolver; // 自定义解析器
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserResolver); // 添加到解析器列表
}
}
5. 配置消息转换器(Message Converter)
用于定义 HTTP 请求/响应的序列化与反序列化方式(如 JSON、XML 格式处理)。
方法:void configureMessageConverters(List<HttpMessageConverter<?>> converters)
示例(自定义 JSON 消息转换器):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 替换默认的 Jackson 转换器为 FastJSON(需引入 FastJSON 依赖)
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
fastJsonConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
// 清空默认转换器(可选),添加自定义转换器
converters.clear();
converters.add(fastJsonConverter);
}
}
6. 配置跨域(CORS)
用于全局设置跨域资源共享策略。
方法:void addCorsMappings(CorsRegistry registry)
示例(全局跨域配置):
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 所有接口
.allowedOrigins("http://localhost:3000") // 允许前端域名
.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法
.allowedHeaders("*") // 允许的请求头
.exposedHeaders("Token") // 允许响应头
.maxAge(3600); // 预检请求缓存时间(秒)
}
}
三、与 WebMvcConfigurationSupport
的区别
Spring MVC 还提供了 WebMvcConfigurationSupport
类(继承自 WebMvcConfigurerAdapter
,已过时),用于更底层的 MVC 配置。但 WebMvcConfigurer
是更推荐的扩展方式,原因如下:
特性 | WebMvcConfigurer |
WebMvcConfigurationSupport |
---|---|---|
设计目的 | 扩展默认配置(保留自动配置的默认行为) | 完全自定义配置(覆盖自动配置的默认行为) |
默认配置 | 自动生效 Spring Boot 的默认 MVC 配置 | 需手动注册默认组件(如视图解析器、拦截器) |
适用场景 | 大多数业务扩展(如添加拦截器、配置视图) | 特殊场景(如完全禁用默认配置,自定义所有组件) |
四、在 Spring Boot 中的使用
Spring Boot 引入 spring-boot-starter-web
依赖后,会自动配置一个 WebMvcAutoConfiguration
类,该类通过 WebMvcConfigurer
扩展了默认的 MVC 配置(如静态资源映射、视图解析器等)。
开发者只需创建自己的 @Configuration
类并实现 WebMvcConfigurer
,即可将自定义配置与自动配置融合。例如:
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
// 覆盖需要的方法,添加自定义配置
}
五、总结
WebMvcConfigurer
是 Spring MVC 提供的核心扩展接口,通过它可以灵活地自定义 MVC 行为(如拦截器、视图解析器、静态资源处理等),同时保留 Spring Boot 的自动配置能力。它是连接业务需求与 Spring MVC 框架的桥梁,广泛应用于前后端分离项目、权限管理、日志监控等场景。