springboot2.0以后推荐实现WebMvcConfigurer去更改springmvc的配置。不建议直接继承WebMvcConfigurationSupport的方式去更改配置。
WebMvcConfigurer是一个接口类 并且里面的方法利用jdk8的特性全部给了默认的空实现,所以springboot不建议使用WebMvcConfigurerAdapter。那我们实现了WebMvcConfigurer的某个方法为什么会完成配置呢。我们先看一下WebMvcAutoConfiguration。
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
@Configuration
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {
}
}
简单看一下这个类的定义 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 在缺失 WebMvcConfigurationSupport的实例完成创建 所以当我们系统中通过继承WebMvcConfigurationSupport来完成配置 那么springboot将不再为我们springmvc提供auto-config。
再看一下DelegatingWebMvcConfiguration 这个类 我们发现这个类最终会继承WebMvcConfigurationSupport 来实现配置。
打开DelegatingWebMvcConfiguration的部分源码
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
}
可以发现WebMvcConfigurerComposite继承WebMvcConfigurer 并且拥有一个属性List<WebMvcConfigurer> delegates 这个属性会在DelegatingWebMvcConfiguration类中 装载系统所有的WebMvcConfigurer实例。而DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport 实现了部分功能。
@Override
protected void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
this.configurers.addReturnValueHandlers(returnValueHandlers);
}
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
this.configurers.configureMessageConverters(converters);
}
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
this.configurers.extendMessageConverters(converters);
}
@Override
protected void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
this.configurers.configureHandlerExceptionResolvers(exceptionResolvers);
}
@Override
protected void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
this.configurers.extendHandlerExceptionResolvers(exceptionResolvers);
}
所以这就是为什么我们实现WebMvcConfigurer接口 就会对springmvc完成设置的原因。 最终还是借助WebMvcConfigurationSupport 去实现配置。