关于SpringMVC中的几个配置类WebMvcConfigurer 、WebMvcConfigurationSupport 、WebMvcConfigurerAdapter

前言

在学习SSM时,对SpringMVC做自定义配置时,接触到了WebMvcConfigurer 、WebMvcConfigurationSupport 、WebMvcConfigurerAdapter这几个抽象类或接口,这三个类都能对SpringMVC做出配置,至于这三者之间的关系与区别,当时也没有在乎,现在来整理一下。

概述

  • 首先最早的一个用来对SpringMVC做出配置的类是WebMvcConfigurerAdapter类,是一个抽象类,从Spring5.0开始已被弃用。
  • 代替WebMvcConfigurerAdapter的,是WebMvcConfigurer接口,此接口中提供了对SpringMVC配置的方法。
  • WebMvcConfigurationSupport 是最笼统的一个配置类,可以对SpringMVC中默认的配置进行覆盖。

WebMvcConfigurerAdapter

WebMvcConfigurerAdapter该抽象类从Spring5.0,也就是SpringBoot2.0后,已被弃用。
替代方案幽有两种:

  • 实现WebMvcConfigurer接口
  • 继承WebMvcConfigurationSupport类
    查看WebMvcConfigurerAdapter这个抽象类,你会发现:它实现自WebMvcConfigurer接口,实现的所有方法都是空方法体(由于Java8之前对接口实现的限制,必须要重写接口中的抽象方法)。
    由于从Java8开始,接口中允许有default方法,对WebMvcConfigurer接口中的方法重写为default,因此WebMvcConfigurerAdapter这样的实现方式也就没有意义了。

WebMvcConfigurationSupport

WebMvcConfigurationSupport是一个抽象类。

查看@EnableWebMvc注解,你会发现,在这个注解中导入了DelegatingWebMvcConfiguration,而这个类又继承自WebMvcConfigurationSupport,
这个WebMvcConfigurationSupport就是笼统地对SpringMVC进行配置的类,会覆盖SpringMVC中默认的配置。
WebMvcConfigurationSupport类同时实现自 ApplicationContextAware, ServletContextAware 两个接口,其中有很多方法提供了@Bean注解用来注入Bean。
因此,要使WebMvcConfigurationSupport类生效,需要配合@Configuration注解来使用
我们自定义的类继承WebMvcConfigurationSupport时,需要加上@Configuration注解
注意:这个配置类太重要了,会覆盖掉SpringMVC中默认配置,一般不要直接继承此类,而是通过实现WebMvcConfigurer接口的方式来配置SpringMVC。

为什么在SpringBoot中通过继承WebMvcConfigurationSupport的方式会导致SpringBoot中的web失效?
在SpringBoot中,SpringMVC的自动配置类WebMvcAutoConfiguration中,有这样一个注解:

@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})

次注解的作用是,当Spring的容器中不存在WebMvcConfigurationSupport类型的Bean时,此自动配置类才会生效。
但是一旦我们通过继承WebMvcConfigurationSupport类来配置SpringMVC,需要配置@Configuration或导入配置类的方式,就会导致Spring容器中存在此类型的Bean,就会导致SpringBoot-web-starter的自动配置失效。

WebMvcConfigurer

WebMvcConfigurerAdapter已被弃用, WebMvcConfigurationSupport不推荐使用
因此,推荐通过实现WebMvcConfigurer接口的方式来配置SpringMVC
通过实现此接口,既可以对SpringMVC的配置做出扩展,也不会影响SpringMVC中的默认配置。
不论是否在SpringBoot环境中,都推荐通过此方式来配置SpringMVC。
支持在一个应用中同时存在多个WebMvcConfigurer的实现类
需要配合@Configuration注解来使用

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// balabala
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置拦截器访问静态资源
// ba la ba la
}
}

需要配置什么选项,就实现WebMvcConfigurer中对应的方法即可

注意:在非SpringBoot的环境中使用时,需要配合@EnableWebMvc来生效
前面提到过,@EnableWebMvc这个注解中导入了DelegatingWebMvcConfiguration类,这是SpringMVC配置的代理类/委托类,在该类中有一个方法setConfigurers()

public void setConfigurers(List<WebMvcConfigurer> configurers) { }

该方法会收集应用中所有的WebMvcConfigurer的实现类,把所有的配置统一汇总到WebMvcConfigurerComposite中,并进行SpringMVC的配置。
在SpringBoot中,Web的自动配置类中,也会导入DelegatingWebMvcConfiguration类进行配置。

所以,无论是否在SpringBoot环境中,都推荐使用WebMvcConfigurer这个配置类。

@EnableWebMvc

再来说说@EnableWebMvc,此注解用在配置类上。
在非SpringBoot环境下,对SpringMVC默认的配置做出修改,需要利用@EnableWebMvc注解,用来启用对SpringMVC的配置
在使用@EnableWebMvc注解后,Spring MVC会做以下工作:

  1. 注册必需的组件:HandlerMapping(处理器映射)、HandlerAdapter(处理器适配器)、HandlerExceptionResolver(处理器异常解析器)和其他一些关键组件,这些组件负责请求处理的关键步骤。
  2. 启用默认的配置:@EnableWebMvc会自动应用一组默认的配置,包括默认的处理器适配器、视图解析器和消息转换器等。
  3. 启用注解驱动:@EnableWebMvc会启用Spring MVC的注解驱动功能,包括注解式的控制器(@Controller)、请求映射(@RequestMapping)、参数绑定、数据校验、消息转换等。

注意:我们在SpringBoot中进行SpringMVC的整合时,导入了web的starter,在这里面已经对SpringMVC做出了默认配置。
请注意,使用@EnableWebMvc注解会导入默认的配置,这意味着它将覆盖Spring Boot自动配置的一些特性
因此,如果你正在使用Spring Boot并且只需要进行一些简单的自定义配置,最好不要使用@EnableWebMvc注解,而是直接在配置类中自定义所需的配置。

!!!在SpringBoot中不要使用@EnableWebMvc就好了,因为SpringBoot中的Starter都会有自动配置

为什么SpringBoot中不要使用@EnableWebMvc注解?
前面提到过,@EnableWebMvc注解中导入了一个类DelegatingWebMvcConfiguration,此类又继承自WebMvcConfigurationSupport,同时此类又被@Configuration注解标注,就会导致Spring容器中会存在WebMvcConfigurationSupport类型的Bean,从而导致WebMvcAutoConfiguration失效,导致SpringBoot环境下Web的自动配置失效

总结

首先这几个配置SpringMVC的内容都是相同的,都能对SpringMVC做出配置

  • WebMvcConfigurerAdapter已被弃用
  • 不推荐通过继承WebMvcConfigurationSupport的方式来配置SpringMVC,因为会导致SpringMVC中的默认配置失效,同时SpringBoot中SpringMVC的自动配置失效。
  • 推荐使用实现WebMvcConfigurer接口的方式来配置SpringMvc
    • 非SpringBoot的环境下,需要配合@EnableWebMvc注解使用
      SpringBoot中不要使用@EnableWebMvc注解

巨人的肩膀

自定义SpringBoot默认MVC配置?好几个坑,避一避 - 知乎
WebMvcConfigurationSupport 和 WebMvcConfigurer 区别_阿千弟的博客-CSDN博客

posted @   秋天Code  阅读(99)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示