最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?MVC策略模式之MethodArgumentResolver源碼解析

 更新時(shí)間:2023年03月30日 09:00:37   作者:這堆干貨有點(diǎn)猛  
這篇文章主要為大家介紹了Spring?MVC策略模式之MethodArgumentResolver源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文  

Spring MVC 是一個(gè)基于 MVC 設(shè)計(jì)模式的Web框架,它的核心就是 DispatcherServlet,它相當(dāng)于請(qǐng)求的中央處理器。在 DispatcherServlet 中,它使用了 MethodArgumentResolver 來(lái)解析方法參數(shù)。

       MethodArgumentResolver 采用一種策略模式,在 Handler 的方法被調(diào)用前,Spring MVC 會(huì)自動(dòng)將 HTTP 請(qǐng)求中的參數(shù)轉(zhuǎn)換成方法參數(shù)。MethodArgumentResolver 接口的作用就是允許開(kāi)發(fā)人員自定義參數(shù)解析器,以便更好地解析 HTTP 請(qǐng)求中的參數(shù)。

例子

       我們可以通過(guò)實(shí)現(xiàn) MethodArgumentResolver 接口來(lái)創(chuàng)建自己的參數(shù)解析器。MethodArgumentResolver 通過(guò) supportsParameter() 這個(gè)方法用來(lái)判斷參數(shù)是否可以被當(dāng)前解析器解析。如果返回 true,則調(diào)用 resolveArgument() 方法來(lái)解析參數(shù)。

下面是一個(gè)簡(jiǎn)單的例子,演示如何實(shí)現(xiàn)一個(gè)自定義的 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;
    }
}

       在上面的例子中,我們實(shí)現(xiàn)了一個(gè) CustomArgumentResolver,用來(lái)解析 CustomObject 類(lèi)型的參數(shù)。supportsParameter() 方法判斷參數(shù)類(lèi)型是否為 CustomObject 類(lèi)型,如果是則返回true。resolveArgument() 方法用來(lái)解析參數(shù),將請(qǐng)求中的 "age" 和 "name" 參數(shù)設(shè)置到 CustomObject 對(duì)象中。

源碼分析

       Spring MVC 中有很多默認(rèn)的參數(shù)解析器,比如 RequestParamMethodArgumentResolver、PathVariableMethodArgumentResolver、ModelMethodProcessor 等。下面我們來(lái)看一下這些解析器的源碼實(shí)現(xiàn)。

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 用來(lái)解析請(qǐng)求中的 @RequestParam 注解參數(shù)。

supportsParameter() 方法判斷參數(shù)是否有 @RequestParam 注解,如果有則返回 true。

resolveArgument()方法解析參數(shù),獲取 RequestParam 注解的 value、defaultValue 和 required 屬性,然后根據(jù)參數(shù)名從請(qǐng)求中獲取參數(shù)值,最后將參數(shù)值轉(zhuǎn)換成目標(biāo)類(lèi)型。

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 用來(lái)解析請(qǐng)求中的 @PathVariable 注解參數(shù)。

supportsParameter() 方法判斷參數(shù)是否有 @PathVariable 注解,如果有則返回 true。

resolveArgument() 方法解析參數(shù),獲取 @PathVariable 注解的 value 屬性,然后從請(qǐng)求中獲取 URI 模板變量的值,最后將變量值轉(zhuǎn)換成目標(biāo)類(lèi)型。

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);
    }
}

用來(lái)處理 Handler 方法的返回值,并將返回值添加到 Model中。

supportsReturnType() 方法判斷返回類(lèi)型是否為 Model 類(lèi)型或其子類(lèi),如果是則返回 true。

handleReturnValue() 方法將返回值轉(zhuǎn)換成 Map 類(lèi)型,然后將 Map 中的鍵值對(duì)添加到 Model 中。

總結(jié)

       MethodArgumentResolver 的主要作用就是將請(qǐng)求參數(shù)轉(zhuǎn)換為 Handler 方法的參數(shù)。在Spring MVC中,有很多默認(rèn)的MethodArgumentResolver實(shí)現(xiàn),例如RequestParamMethodArgumentResolver、PathVariableMethodArgumentResolver、ModelAttributeMethodArgumentResolver 等,這些默認(rèn)的 MethodArgumentResolver 實(shí)現(xiàn)可以滿足大多數(shù)場(chǎng)景的需求,如果需要自定義 MethodArgumentResolver 實(shí)現(xiàn),可以通過(guò)實(shí)現(xiàn) MethodArgumentResolver 接口來(lái)實(shí)現(xiàn),這些都遵循了策略模式的設(shè)計(jì)原則,具有較好的可擴(kuò)展性和可維護(hù)性

以上就是Spring MVC策略模式之MethodArgumentResolver源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC MethodArgumentResolver的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中構(gòu)造器內(nèi)部調(diào)用構(gòu)造器實(shí)例詳解

    java中構(gòu)造器內(nèi)部調(diào)用構(gòu)造器實(shí)例詳解

    在本篇文章里小編給大家分享的是關(guān)于java中構(gòu)造器內(nèi)部調(diào)用構(gòu)造器實(shí)例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-05-05
  • SpringBoot集成SOL鏈的詳細(xì)過(guò)程

    SpringBoot集成SOL鏈的詳細(xì)過(guò)程

    Solanaj 是一個(gè)用于與 Solana 區(qū)塊鏈交互的 Java 庫(kù),它為 Java 開(kāi)發(fā)者提供了一套功能豐富的 API,使得在 Java 環(huán)境中可以輕松構(gòu)建與 Solana 區(qū)塊鏈交互的應(yīng)用程序,這篇文章主要介紹了SpringBoot集成SOL鏈的詳細(xì)過(guò)程,需要的朋友可以參考下
    2025-01-01
  • Java BigDecimal使用及基本運(yùn)算(推薦)

    Java BigDecimal使用及基本運(yùn)算(推薦)

    Java在java.math包中提供的API類(lèi)BigDecimal,用來(lái)對(duì)超過(guò)16位有效位的數(shù)進(jìn)行精確的運(yùn)算。這篇文章主要介紹了Java BigDecimal使用指南針(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來(lái)的方法

    maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來(lái)的方法

    這篇文章主要介紹了maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來(lái)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Spring Boot 整合持久層之JdbcTemplate

    Spring Boot 整合持久層之JdbcTemplate

    持久層是 Java EE 中訪問(wèn)數(shù)據(jù)庫(kù)的核心操作,Spring Boot 中對(duì)常見(jiàn)的持久層框架都提供了自動(dòng)化配置,例如 JdbcTemplate 、 JPA 等,Mybatis 的自動(dòng)化配置則是 Mybatis 官方提供的
    2022-08-08
  • 高并發(fā)下restTemplate的錯(cuò)誤分析方式

    高并發(fā)下restTemplate的錯(cuò)誤分析方式

    這篇文章主要介紹了高并發(fā)下restTemplate的錯(cuò)誤分析方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring?Boot?快速使用?HikariCP?連接池配置詳解

    Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項(xiàng)目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會(huì)被自動(dòng)引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下
    2023-06-06
  • springboot整合redis修改分區(qū)的操作流程

    springboot整合redis修改分區(qū)的操作流程

    這篇文章主要介紹了springboot整合redis修改分區(qū)的操作流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 中的垃圾回收機(jī)制詳解

    Java 中的垃圾回收機(jī)制詳解

    這篇文章主要為大家詳細(xì)介紹了Java垃圾回收機(jī)制的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • springmvc如何使用POJO作為參數(shù)

    springmvc如何使用POJO作為參數(shù)

    這篇文章主要介紹了springmvc如何使用POJO作為參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

汶川县| 抚顺县| 江永县| 义马市| 隆昌县| 芮城县| 深圳市| 昌吉市| 福清市| 改则县| 新沂市| 保德县| 阳原县| 米泉市| 曲麻莱县| 井研县| 文昌市| 莱阳市| 西昌市| 那坡县| 普定县| 峨眉山市| 广州市| 光泽县| 河北省| 出国| 宜兴市| 嘉定区| 调兵山市| 涿鹿县| 开阳县| 射阳县| 平遥县| 灵丘县| 邹平县| 将乐县| 永安市| 利川市| 淮安市| 隆回县| 贡觉县|