Spring boot WebMvcConfigurationSupport vs WebMvcConfigurer

本文分析了SpringBoot环境中WebMvcConfigurer与WebMvcConfigurationSupport的区别,解释了为何同时使用两者会导致自定义配置不生效的问题,并通过代码示例进行了解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:区别是当继承WebMvcConfigurationSupport时会覆盖原配置,而WebMvcConfigurer是自定义配置.

最近在Spring boot环境下调试一个问题时发现自己定义的WebMvcConfigurer不生效,然后就把Spring boot加载Spring mvc的配置看了一遍,后来发现WebMvcAutoConfiguration类ConditionOn了WebMvcConfigurationSupport方法,当实现这个类时不执行Spring boot的WebMvcAutoConfiguration类配置信息,也就是我们在项目中不能及继承WebMvcConfigurationSupport类又实现

WebMvcConfigurer类.

代码分析:

从EnableWebMvcConfiguration配置类开始,当它注入时父类会注入Spring容器中所有的WebMvcConfigurer类

接着注入RequestMappingHandlerAdapter Bean 它会调用父类的requestMappingHandlerAdapter方法

这个时候获取配置,例如自定义了返回结果Handler, WebMvcConfigurerComposite会遍历调用WebMvcConfigurer实现类的

addReturnValueHandlers方法,会把自定义配置加载到默认的配置中.

### 如何在 Spring MVC 中使用 `WebMvcConfigurer` 添加自定义参数解析器 为了实现更灵活的请求处理,在 Spring MVC 应用程序中可以通过配置类来扩展框架的功能。通过继承 `WebMvcConfigurer` 接口并重写相应方法,可以定制化应用程序的行为。 当需要向应用添加额外的参数解析逻辑时,可利用 `addArgumentResolvers` 方法注册新的或者覆盖默认的处理器。下面是一个具体的例子展示如何操作: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { // 注册自定义参数解析器实例到列表中 resolvers.add(new CustomArgumentResolver()); } } ``` 在这个片段里,创建了一个名为 `WebConfig` 的配置类实现了 `WebMvcConfigurer` 接口,并覆写了 `addArgumentResolvers` 函数用于引入外部定义好的 `CustomArgumentResolver` 实现[^1]。 对于想要具体了解 `@SpringBootApplication` 所提供便利性的开发者来说,该注解简化了很多基础设置工作,自动集成了多个常用功能模块,使得项目初始化更加便捷高效[^3]。 #### 自定义参数解析器示例 这里给出一个简单的自定义参数解析器的例子,它能够识别特定类型的 HTTP 请求头并将它们转换为目标对象属性值: ```java import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; @Component public class HeaderBasedArgumentResolver implements HandlerMethodArgumentResolver { private final String HEADER_NAME = "X-Custom-Header"; @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(String.class); } @Override public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return webRequest.getHeader(HEADER_NAME); } } ``` 上述代码展示了如何构建一个基于HTTP头部信息读取字符串值作为控制器方法入参的方式。此解析器会检查目标方法签名中的参数是否为 `String` 类型,并尝试从中提取指定名称的请求头数据返回给调用方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值