在springboot 1.x中,对springmvc的配置,我们一般都继承抽象类 WebMvcConfigurerAdapter,根据需要覆盖其中一些的配置方法即可调整spring mvc的默认配置。如下示例:
/**
* @author yawn http://jvm123.com
* 2019/10/4 13:39
*/
@Configuration
@EnableWebMvc
class MvcConfig extends WebMvcConfigurerAdapter {
@Override
void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true) // 匹配 index.*
.setUseTrailingSlashMatch(true) // 匹配 /index/
}
@Override
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)) // 乱码问题
converters.add(new MappingJackson2HttpMessageConverter()) // 转换object
// converters.add(new MappingJackson2XmlHttpMessageConverter()) // 转换object
super.configureMessageConverters(converters)
}
}
但是,在spring boot 2.x中, WebMvcConfigurerAdapter 被标记为过期,那我们怎样进行配置spring mvc呢?
其实 WebMvcConfigurerAdapter 实现了WebMvcConfigurer接口, 如下图关系:

所以, WebMvcConfigurerAdapter 只是一个适配器,而真正定义spring mvc 配置的接口是 WebMvcConfigurer 。根据 WebMvcConfigurer 接口上的说明,我们可以知道这个接口的作用:
Defines callback methods to customize the Java-based configuration for Spring MVC enabled via @EnableWebMvc.
@EnableWebMvc-annotated configuration classes may implement this interface to be called back and given a chance to customize the default configuration. Consider extending WebMvcConfigurerAdapter, which provides a stub implementation of all interface methods.
即 WebMvcConfigurer 规定了基于java-based配置自定义springmvc的回调方法。 @EnableWebMvc 注解的配置类需要实现这个接口才能改变默认的配置,可以考虑继承 空实现的类 WebMvcConfigurerAdapter 。
也就是说,我们也可以直接实现 WebMvcConfigurer接口,但唯一的缺点就是需要实现每一个方法;但如果继承抽象类的话,只需要覆盖需要的方法。
Spring boot 2.x web mvc 配置方法
Spring boot 2.x,最低使用jdk 1.8。在jdk 1.8中,由于接口中可以存在default方法,即接口的默认方法,所以没必要再使用 空实现的类 WebMvcConfigurerAdapter 。
所以 Spring boot 2.x 中, WebMvcConfigurer 接口中对spring mvc配置的各个方法都改为default的,都有一个空的实现,我们在自定义配置的时候,只需要重写其中的人一几个default方法即可。所以 WebMvcConfigurerAdapter 也就没有什么价值了,不推荐使用它。具体配置代码如下:
/**
* @author yawn http://jvm123.com
* 2019/10/4 13:39
*/
@Configuration
@EnableWebMvc
class MvcConfig implements WebMvcConfigurer {
@Autowired
LoginInterceptor loginInterceptor
@Autowired
AuditInterceptor auditInterceptor
@Override
void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "/home.html")
registry.addRedirectViewController("/admin", "/admin/index.html")
registry.addViewController("index")
}
@Override
void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
registry.addResourceHandler("/favicon.ico")
.addResourceLocations("classpath:/static/images/favicon.ico")
}
@Override
void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/error")
// .excludePathPatterns("/admin")
// .excludePathPatterns("/admin")
// .excludePathPatterns("/admin/index.html")
// registry.addInterceptor(auditInterceptor)
// .addPathPatterns("/**")
// .excludePathPatterns("/error")
}
@Override
void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*")
.allowedOrigins("*")
.allowedHeaders("*")
}
@Override
void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true) // 匹配 index.*
.setUseTrailingSlashMatch(true) // 匹配 /index/
}
@Override
void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)) // 乱码问题
converters.add(new MappingJackson2HttpMessageConverter()) // 转换object
// converters.add(new MappingJackson2XmlHttpMessageConverter()) // 转换object
}
}
注:本文示例代码使用groovy实现,使用java或kotlin语言时请仅参考,或者对代码进行相应调整。