返回顶部
首页 > 资讯 > 精选 >Spring MVC策略模式之MethodArgumentResolver源码分析
  • 317
分享到

Spring MVC策略模式之MethodArgumentResolver源码分析

2023-07-05 18:07:52 317人浏览 泡泡鱼
摘要

今天小编给大家分享一下spring mvc策略模式之MethodArgumentResolver源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后

今天小编给大家分享一下spring mvc策略模式之MethodArgumentResolver源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    正文  

    Spring MVC 是一个基于 MVC 设计模式WEB框架,它的核心就是 DispatcherServlet,它相当于请求的中央处理器。在 DispatcherServlet 中,它使用了 MethodArgumentResolver 来解析方法参数。

           MethodArgumentResolver 采用一种策略模式,在 Handler 的方法被调用前,Spring MVC 会自动将 Http 请求中的参数转换成方法参数。MethodArgumentResolver 接口的作用就是允许开发人员自定义参数解析器,以便更好地解析 HTTP 请求中的参数。

    例子

           我们可以通过实现 MethodArgumentResolver 接口来创建自己的参数解析器。MethodArgumentResolver 通过 supportsParameter() 这个方法用来判断参数是否可以被当前解析器解析。如果返回 true,则调用 resolveArgument() 方法来解析参数。

    下面是一个简单的例子,演示如何实现一个自定义的 MethodArgumentResolver:

    public class CustomArgumentResolver implements MethodArgumentResolver {    @Override    public boolean supportsParameter(MethodParameter parameter) {        return parameter.getParameterType().equals(CustomObject.class);    }    @Override    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {        CustomObject customObject = new CustomObject();        customObject.setName(webRequest.getParameter("name"));        customObject.setAge(Integer.parseInt(webRequest.getParameter("age")));        return customObject;    }}

           在上面的例子中,我们实现了一个 CustomArgumentResolver,用来解析 CustomObject 类型的参数。supportsParameter() 方法判断参数类型是否为 CustomObject 类型,如果是则返回true。resolveArgument() 方法用来解析参数,将请求中的 "age" 和 "name" 参数设置到 CustomObject 对象中。

    源码分析

           Spring MVC 中有很多默认的参数解析器,比如 RequestParamMethodArgumentResolver、PathVariableMethodArgumentResolver、ModelMethodProcessor 等。下面我们来看一下这些解析器的源码实现。

    RequestParamMethodArgumentResolver:

    public class RequestParamMethodArgumentResolver implements HandlerMethodArgumentResolver {    @Override    public boolean supportsParameter(MethodParameter parameter) {        return parameter.hasParameterAnnotation(RequestParam.class);    }    @Override    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {        // 获取注解        RequestParam annotation = parameter.getParameterAnnotation(RequestParam.class);        String paramName = annotation.value();        String defaultValue = annotation.defaultValue();        boolean required = annotation.required();        String[] paramValues = webRequest.getParameterValues(paramName);        if (paramValues == null || paramValues.length == 0) {            if (required) {                throw new MissingServletRequestParameterException(paramName, parameter.getParameterType().getSimpleName());            }            return defaultValue;        }        if (paramValues.length == 1) {            return convertIfNecessary(paramValues[0], parameter.getParameterType());        }        return Arrays.stream(paramValues).map(value -> convertIfNecessary(value, parameter.getParameterType())).collect(Collectors.toList());    }}

           RequestParamMethodArgumentResolver 用来解析请求中的 @RequestParam 注解参数

    supportsParameter() 方法判断参数是否有 @RequestParam 注解,如果有则返回 true。

    resolveArgument()方法解析参数,获取 RequestParam 注解的 value、defaultValue 和 required 属性,然后根据参数名从请求中获取参数值,最后将参数值转换成目标类型。

    PathVariableMethodArgumentResolver:

    public class PathVariableMethodArgumentResolver implements HandlerMethodArgumentResolver {    @Override    public boolean supportsParameter(MethodParameter parameter) {        return parameter.hasParameterAnnotation(PathVariable.class);    }    @Override    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {        PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class);        String attributeName = annotation.value();        Map<String, String> uriTemplateVariables = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);        String attributeValue = uriTemplateVariables.get(attributeName);        return convertIfNecessary(attributeValue, parameter.getParameterType());    }}

           PathVariableMethodArgumentResolver 用来解析请求中的 @PathVariable 注解参数

    supportsParameter() 方法判断参数是否有 @PathVariable 注解,如果有则返回 true。

    resolveArgument() 方法解析参数,获取 @PathVariable 注解的 value 属性,然后从请求中获取 URI 模板变量的值,最后将变量值转换成目标类型。

    ModelMethodProcessor:

    public class ModelMethodProcessor implements HandlerMethodReturnValueHandler {    @Override    public boolean supportsReturnType(MethodParameter returnType) {        return Model.class.isAssignableFrom(returnType.getParameterType());    }    @Override    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {        Model model = mavContainer.getModel();        model.addAllAttributes((Map<String, ?>) returnValue);    }}

    用来处理 Handler 方法的返回值,并将返回值添加到 Model中。

    supportsReturnType() 方法判断返回类型是否为 Model 类型或其子类,如果是则返回 true。

    handleReturnValue() 方法将返回值转换成 Map 类型,然后将 Map 中的键值对添加到 Model 中。

    以上就是“Spring MVC策略模式之MethodArgumentResolver源码分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: Spring MVC策略模式之MethodArgumentResolver源码分析

    本文链接: https://lsjlt.com/news/354525.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Spring MVC策略模式之MethodArgumentResolver源码分析
      今天小编给大家分享一下Spring MVC策略模式之MethodArgumentResolver源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后...
      99+
      2023-07-05
    • Java设计模式之策略模式实例分析
      这篇文章主要介绍“Java设计模式之策略模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java设计模式之策略模式实例分析”文章能帮助大家解决问题。1.基本介绍1)策略模式(Strateg...
      99+
      2023-06-30
    • 基于Android设计模式之--SDK源码之策略模式的详解
      策略模式其实特别简单(听到这句话,大家是不是心里一下子放松了?)。比如排序,官方告诉大家我这里有一个排序的接口ISort的sort()方法,然后民间各尽其能,实现这个排序的方法...
      99+
      2022-06-06
      策略模式 sdk Android
    • Java策略模式实例分析
      这篇文章主要讲解了“Java策略模式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java策略模式实例分析”吧!优点算法可以自由切换。避免使用多重条件判断。扩展性良好。缺点策略类会增...
      99+
      2023-06-29
    • C#策略模式的示例分析
      小编给大家分享一下C#策略模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!策略模式所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,...
      99+
      2023-06-29
    • java策略模式的示例分析
      这篇文章给大家分享的是有关java策略模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。类型:行为类模式类图:  &...
      99+
      2023-05-30
      java
    • Java设计模式之策略模式深入刨析
      目录1.基本介绍2.传统方式3.采用策略模式4.策略模式的注意事项和细节1.基本介绍 1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之...
      99+
      2024-04-02
    • Lucene索引删除策略源码分析
      本文小编为大家详细介绍“Lucene索引删除策略源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Lucene索引删除策略源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。IndexCommitLuce...
      99+
      2023-07-05
    • java设计模式中策略模式的示例分析
      小编给大家分享一下java设计模式中策略模式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!策略模式策略模式(Strategy Pattern)属于行为型模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实...
      99+
      2023-06-20
    • vue 2.5.1源码之Vue.extend和data合并策略的示例分析
      这篇文章主要介绍了vue 2.5.1源码之Vue.extend和data合并策略的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1....
      99+
      2024-04-02
    • web前端中策略模式的示例分析
      这篇文章将为大家详细讲解有关web前端中策略模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。策略模式(Strategy Pattern)策略模式简单描述就是:...
      99+
      2024-04-02
    • Spring源码解析之编程式事务的示例分析
      这篇文章主要为大家展示了“Spring源码解析之编程式事务的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring源码解析之编程式事务的示例分析”这篇文章吧。一、前言在Spring中...
      99+
      2023-06-15
    • 5分钟学会Android设计模式之策略模式StrategyPattern教程
      目录5分钟设计模式之策略模式(Strategy Pattern)1、收到需求2、不使用策略模式3、使用策略模式4、小结结尾5分钟设计模式之策略模式(Strategy Pattern)...
      99+
      2023-03-15
      Android策略模式Strategy Pattern Android 设计模式
    • Spring源码解析之编程式事务
      目录一、前言二、编程式事务解析三、编程式事务示例四、TransactionCallback五、TransactionCallbackWithoutResult一、前言 在Sprin...
      99+
      2024-04-02
    • Mybatis源码分析之插件模块
      Mybatis插件模块 插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件; PageHelper官网:https://github.com/pagehe...
      99+
      2024-04-02
    • vue源码之批量异步更新策略的深入解析
      vue异步更新源码中会有涉及事件循环、宏任务、微任务的概念,所以先了解一下这几个概念。 一、事件循环、宏任务、微任务 1.事件循环Event Loop:浏览器为了协调事件处理、脚本...
      99+
      2024-04-02
    • Spring之ShutDown Hook死锁现象源码分析
      本篇内容主要讲解“Spring之ShutDown Hook死锁现象源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring之ShutDown Hook死锁现象源码分...
      99+
      2023-07-05
    • SaltStack源码分析之使用MongoDB模块
      MongoDB模块/usr/lib/python2.6/site-packages/salt/modules/mongodb.pyMongoDB模块会先去检查是否安装有PyMongo模块# -*-...
      99+
      2024-04-02
    • Redisson分布式锁之加解锁源码分析
      这篇文章主要介绍“Redisson分布式锁之加解锁源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redisson分布式锁之加解锁源码分析”文章能帮助大家解决问题。锁的可重入性我们都知道,Ja...
      99+
      2023-07-05
    • Spring声明式事务注解的源码分析
      本文小编为大家详细介绍“Spring声明式事务注解的源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring声明式事务注解的源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、@EnableTr...
      99+
      2023-07-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作