WebMvcConfigurer配置接口详解
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 {@Overridepublic 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 {@Autowiredprivate LoginInterceptor loginInterceptor; // 自定义拦截器@Overridepublic 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 {@Overridepublic 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 {@Autowiredprivate CurrentUserArgumentResolver currentUserResolver; // 自定义解析器@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 框架的桥梁,广泛应用于前后端分离项目、权限管理、日志监控等场景。