WebMvcConfigurationSupport和WebMvcConfigurer

问题描述: 今天在使用SpringBoot 2.x更改其默认配置时,使用了下面的方式:

public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/goods/**").addResourceLocations("/templates/");
        super.addResourceHandlers(registry);
    }
}

即使用了WebMvcConfigurationSupport作为辅助类自定义MVC的一些配置,发现默认的配置不生效了,即通过http://localhost:8080/brand.html访问不到这个文件了:

image.png

排查了很久,原来当classpath中存在WebMvcConfigurationSupport 对象时,自动配置就不会生效:


image.png

这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。

如果想要使用自动配置生效,又要按自己的需要重写某些方法,比如增加 viewController ,则可以自己的配置类可以继承 WebMvcConfigurerAdapter 这个类。不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好。Java 8以后接口可以有default方法,因此直接实现WebMvcConfigurer接口就好(WebMvcConfigurerAdapter 存在意义就是为WebMvcConfigurer接口提供空实现)

例如我们还是为静态资源提供一个静态资源提供一个处理器:


@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/goods/**").addResourceLocations("/goods/");
    }
}

推荐阅读:
继承WebMvcConfigurationSupport后自动配置不生效及如何配置拦截器
WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南

你可能感兴趣的:(WebMvcConfigurationSupport和WebMvcConfigurer)