springboot源码-springmvc之WebMvcConfigurer

mac2024-08-15  59

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

最新回复(0)