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 去實現配置。