目录
【一】基本定义与对比
| 特性 | WebMvcConfigurer | WebMvcConfigurationSupport | WebMvcConfigurerAdapter |
|---|---|---|---|
| 类型 | 接口 | 抽象类 | 抽象类 |
| 主要用途 | 增量扩展MVC配置 | 全局接管并替换所有MVC配置 | 简化实现(旧时代适配器) |
| Spring Boot 自动配置 | 兼容,会融合 | 不兼容,会失效 | 同 WebMvcConfigurer(废弃前使用) |
| 适合场景 | 90% 的定制化需求 | 需要完全替换默认MVC配置 | Java 8前避免写所有空方法(废弃) |
【二】版本背景和演进历史
1️⃣ Spring 3.1
-
引入 WebMvcConfigurer 接口
-
允许按需扩展MVC配置(拦截器、格式化器、视图解析器)
2️⃣ Spring 4.x
-
Java 8 之前,接口没有
default方法 -
为了解决「实现接口需要实现所有方法」的问题,提供了 WebMvcConfigurerAdapter 作为抽象类,该类所有方法都是空实现,只重写需要的即可。
3️⃣ Spring 5.x
-
java8之后接口可以有
default方法,WebMvcConfigurer 所有方法都自带默认实现,所以WebMvcConfigurerAdapter 就被标记为废弃。
4️⃣ WebMvcConfigurationSupport
-
从早期版本就有,是Spring MVC核心的配置基类
-
里面包含了所有的 HandlerMapping、HandlerAdapter、MessageConverters、Validator 等 Bean 的完整声明。
【三】三个的主要职责和设计目标
① WebMvcConfigurer
✅ 设计目标
-
扩展点(Extension Point)
-
不接管,不替换
-
Spring 默认配置会和扩展的配置合并
✅ SpringBoot 特性
-
自动扫描所有实现了 WebMvcConfigurer 的 Bean
-
自动调用它们的 addInterceptors / configureMessageConverters 等方法
-
多个 configurer 可以合并
✅ 示例
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
✅ 特点
-
最小侵入
-
推荐在微服务/企业项目里用
② WebMvcConfigurationSupport
✅ 设计目标
-
模板基类(Template Support)
-
提供所有核心Bean的完整、可覆盖定义
✅ 机制
-
里面声明了 @Bean
-
RequestMappingHandlerMapping
-
RequestMappingHandlerAdapter
-
ExceptionHandlerExceptionResolver
-
FormattingConversionService
-
MessageConverters
-
Validator
-
ContentNegotiationManager
-
ViewResolver
-
-
这些 Bean 是 DispatcherServlet 的骨架配置
✅ 继承后效果
-
Spring Boot 的自动配置会失效
-
你的配置类会接管全部 MVC 配置
-
你需要自己声明所有 Bean,否则会缺失
✅ 特点
-
适合深度扩展彻底订制的场景,高度可控,但配置复杂。
✅ 典型用途
-
你要完全替换 Spring Boot 的默认 MVC 行为
-
多 DispatcherServlet 实现
③ WebMvcConfigurerAdapter
-
纯粹是为了 Java 8 之前没有接口默认方法,是个空实现适配器
-
Spring 5+ 以后已废弃,官方建议直接实现 WebMvcConfigurer
【四】SpringBoot 的自动配置细节
Spring Boot 的核心逻辑:
✅ 自动配置默认使用 DelegatingWebMvcConfiguration
-
这个是内部的 @Configuration
-
继承自 WebMvcConfigurationSupport
-
特点:
-
注入所有 WebMvcConfigurer
-
调用它们的扩展方法
-
再定义所有 Bean
-
✅ 逻辑链路(简化版):
@EnableWebMvc --> WebMvcConfigurationSupport 没有@EnableWebMvc --> DelegatingWebMvcConfiguration(Spring Boot 自动配置里注册)
✅ 当你用了:
-
@EnableWebMvc
-
继承 WebMvcConfigurationSupport
Spring Boot 的 DelegatingWebMvcConfiguration 就会被排除。
✅ 结果
-
自动配置消失
-
你必须自己声明所有 HandlerMapping、MessageConverters 等 Bean
【五】源码分析:Spring MVC 核心调用链
🔎 WebMvcConfigurationSupport 的关键源码结构
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = createRequestMappingHandlerMapping(); // set Order, interceptors, etc. return mapping;
}
@Bean
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter(); // set Converters, ArgumentResolvers, etc. return adapter;
}
✔️ 你继承后可以覆盖这些方法
✔️ 全部自己定制
🔎 DelegatingWebMvcConfiguration(Spring Boot 的自动配置核心)
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
@Autowired(required = false)
private List<WebMvcConfigurer> configurers;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
for (WebMvcConfigurer configurer : this.configurers) {
configurer.addInterceptors(registry);
}
}
}
✔️ 关键设计
把所有 WebMvcConfigurer 的方法调用一遍,真正实现「可插拔、可组合」的配置扩展
【六】实际项目的推荐策略
✅ 推荐 大部分的业务场景使用 WebMvcConfigurer,Spring Boot 自动完成整合,低侵入、低维护成本。
✅ 特殊场景需要全局自定义的情况,继承 WebMvcConfigurationSupport接管所有配置,适合网关、自研框架、需要多 DispatcherServlet等场景。
✅ 不推荐 WebMvcConfigurerAdapter(已废弃)
371



被折叠的 条评论
为什么被折叠?



