WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南相关的知识,希望对你有一定的参考价值。

参考技术A 该类提供了主要的 MVC 配置方法,通过直接继承 WebMvcConfiguration ,并在继承类上 加上 @EnableWebMvc 和 @Configuration 注解之后。便可以在子类中实现父类的方法 ,更甚至可以实现含有@Bean 注解的方法,但记得一定要在实现的方法上加上 @Bean

WebMvcConfigurationSupport 中提供了一些内容为空的方法,这些方法主要是用来给子类自定义时实现,根据方法名称的分类,有以下几种类型

该类是通过 "回调" 的方式来进行自定义化 Spring MVC 相关配置,大多数情况下,我们通过实现它的 抽象类 WebMvcConfigurerAdapter 来配置,因为它有WebMvcConfigurer 接口所有方法的一个空的实现,WebMvcConfigurer 接口中的所有方法都是 WebMvcConfigurationSupport 中提供给子类实现的空方法。

为什么是说它是通过回调来实现的自定义配置? 用DelegatingWebMvcConfiguration 和 WebMvcConfigurerComposite 类来解释。

DelegatingWebMvcConfiguration 类 简称【代理类】通过继承 WebMvcConfigurationSupport,所以拥有了 customize 自定义mvc 配置的权利。该类通过持有的对象 WebMvcConfigurerComposite 简称【聚合类】则是一个聚合了所有实现了 WebMvcConfigurer 接口的子类,如此一来,【代理类】所有实现 WebMvcConfigurationSupport 的方法调用时,则是将【聚合类】中的所有WebMvcConfiguer 接口的实现类的该方法依次进行调用

WebMvcConfigurationSupport 在整个应用程序中只会生效一个,如果用户已经实现了 WebMvcConfigurationSupport,则 DelegatingWebMvcConfiguration 将不会生效,换句话来说,WebMvcConfigurer 的所有实现类将不会生效。而在Spring 中,如果类路径上不存在 WebMvcConfigurationSupport 的实例,则将会默认实现
WebMvcConfigurerAdapter、DelegatingWebMvcConfiguration 来自定义mvc 配置。

而当 WebMvcAutoConfiguration 不生效时会导致以下几个问题:
1.WebMvcProperties 和 ResourceProperties 失效

因为两个配置类中的属性都在 WebMvcAutoConfiguration 中使用

2.类路径上的 HttpMessageConverter 失效

如:StringHttpMessageConverterConfiguration、MappingJackson2HttpMessageConverter ,因为 HttpMessageConverters 中持有着所有HttpMessageConverter的实例, 在 WebMvcAutoConfigurationAdapter 中会注入 HttpMessageConverters ,因此当 WebMvcAutoConfigurationAdapter 不加载时,则会失效,间接的造成 spring.http.encoding.charset 与 spring.jackson.date-format 假象的失效。

如:
StringHttpMessageConverter 会使用 spring.http.encoding.charset 配置, 默认编码为:ISO-8859-1

常用解决方案:
因为已知的配置类都已通过 @Bean 注册在容器中,那么我们可以在使用 WebMvcConfigurationSupport 时,通过 @Autowired 注入到配置类中,然后替换调 WebMvcConfigurationSupport 默认的配置即可,如:

也可以根据需求来重新实现。总之明白为什么会失效之后,解决起来思路也更清晰

以上是关于WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南的主要内容,如果未能解决你的问题,请参考以下文章

原理:WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南

WebMvcConfigurer 与 WebMvcConfigurationSupport 关系及避坑指南

WebMvcConfigurer addCorsMappings 不起作用

Maven 依赖 spring-web 与 spring-webmvc

webmvc与swagger页面冲突问题

spring设计好美:WebMvcConfigurer