一.简介
WebMvcConfigurer
接口在 Spring Framework 中用于定制和配置 Spring MVC 的各种特性。通过实现这个接口,你可以添加自定义配置和功能,而不是完全替换 Spring MVC 的默认配置。
WebMvcConfigurer 和 WebMvcConfigurationSupport 的区别
- WebMvcConfigurer:
WebMvcConfigurer
是一个接口,通常由用户实现,并且用于配置 Spring MVC。- 提供了一系列的回调方法,允许用户在 Spring MVC 中添加自定义配置。
- 通过实现
WebMvcConfigurer
接口,可以进行一些简单的配置,如添加拦截器、添加视图控制器、配置视图解析器等。
- WebMvcConfigurationSupport:
WebMvcConfigurationSupport
是一个类,它是WebMvcConfigurerAdapter
的后继者(WebMvcConfigurerAdapter
已在 Spring 5.0 中标记为过时)。- 可以继承
WebMvcConfigurationSupport
类,覆盖其中的方法,实现更详细和复杂的配置。 WebMvcConfigurationSupport
提供了一些模板方法,允许用户在配置中进行更精细的控制。
- 总结:
WebMvcConfigurer更加灵活,提供了一系列的回调方法供用户配置,而
WebMvcConfigurationSupport则更为底层,提供了更多的细粒度的配置选项,允许用户更深入地定制 Spring MVC 的行为。通常情况下,优先选择使用
WebMvcConfigurer,只有在需要更高级的自定义配置时才考虑使用
WebMvcConfigurationSupport`。
二.主要功能和用途
WebMvcConfigurer
接口提供了一系列的默认方法,你可以重写这些方法来配置 Spring MVC。以下是一些主要功能:
- 配置视图解析器(View Resolvers):定制如何解析视图名称。
- 添加静态资源处理:配置静态资源的处理,比如 CSS、JavaScript、图片等。
- 配置跨域请求(CORS):允许或限制跨域请求。
- 添加拦截器(Interceptors):在请求处理之前或之后执行自定义逻辑。
- 配置内容协商:定制请求和响应的内容类型(如 JSON、XML)。
- 添加格式化程序和转换器(Formatters and Converters):定制数据绑定和类型转换。
- 全局异常处理:配置全局异常处理器。
- 配置消息转换器(Message Converters):定制请求和响应的消息转换逻辑。
三.代码示例
@Configuration // 表示这是一个Spring配置类
public class WebConfig implements WebMvcConfigurer {
// 配置视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp"); // 配置JSP视图解析器,设置视图存放的目录和文件后缀
}
// 添加静态资源处理
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**") // 设置静态资源的URL路径模式
.addResourceLocations("classpath:/static/"); // 设置静态资源的存放位置
}
// 配置跨域请求
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允许对所有URL进行跨域请求
.allowedOrigins("https://example.com") // 设置允许跨域请求的来源
.allowedMethods("GET", "POST", "PUT", "DELETE") // 设置允许的HTTP方法
.allowedHeaders("*"); // 允许任何头部信息
}
// 添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义拦截器,并设置拦截和排除的路径
registry.addInterceptor(new MyCustomInterceptor()) // 添加自定义拦截器
.addPathPatterns("/**") // 对所有URL路径应用拦截器
.excludePathPatterns("/login", "/register"); // 排除登录和注册页面的URL
}
// 配置内容协商
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorParameter(true) // 启用请求参数来决定返回的内容类型
.parameterName("mediaType") // 设置用于内容协商的请求参数名称
.defaultContentType(MediaType.APPLICATION_JSON) // 设置默认内容类型为JSON
.mediaType("xml", MediaType.APPLICATION_XML) // 设置XML内容类型的参数值
.mediaType("json", MediaType.APPLICATION_JSON); // 设置JSON内容类型的参数值
}
// 添加格式化程序和转换器
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new MyCustomFormatter()); // 添加自定义格式化程序
registry.addConverter(new MyCustomConverter()); // 添加自定义转换器
}
// 全局异常处理
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new MyGlobalExceptionHandler()); // 添加自定义的全局异常处理器
}
// 配置消息转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter()); // 添加消息转换器,用于处理JSON
}
}