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 去实现配置。