关于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会做以下工作:
- 注册必需的组件:HandlerMapping(处理器映射)、HandlerAdapter(处理器适配器)、HandlerExceptionResolver(处理器异常解析器)和其他一些关键组件,这些组件负责请求处理的关键步骤。
- 启用默认的配置:@EnableWebMvc会自动应用一组默认的配置,包括默认的处理器适配器、视图解析器和消息转换器等。
- 启用注解驱动:@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的环境下,需要配合@EnableWebMvc注解使用
巨人的肩膀
自定义SpringBoot默认MVC配置?好几个坑,避一避 - 知乎
WebMvcConfigurationSupport 和 WebMvcConfigurer 区别_阿千弟的博客-CSDN博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构