Spring boot 2.x与1.x WebMvc配置的区别(WebMvcConfigurer)

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/11/spring-boot-webmvcconfigurer.html

在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接口, 如下图关系:

Spring boot 2.x与1.x WebMvc配置的区别(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语言时请仅参考,或者对代码进行相应调整。

发表评论