美文网首页程序员
Param Splitter 解决“大集合参数”

Param Splitter 解决“大集合参数”

作者: MS100 | 来源:发表于2023-02-02 15:25 被阅读0次

ParamSplitter

当某个接口的集合参数有数量限制的时候,我们可能需要循环调用。可以使用@ParamSplitter注解实现自动拆分。

安装

Maven


<dependency>
  <groupId>io.github.ms100</groupId>
  <artifactId>param-splitter</artifactId>
  <version>1.0.0</version>
</dependency>

使用

当方法对其参数中的某个【集合参数】的大小有限制时,在此参数上加上 @SplitParam 注解。在调用方法时,当【集合参数】的大小超过限制会将【集合参数】分块后循环执行,最后将结果合并返回。调用此方法时就不必关心【集合参数】的大小限制了。

一个方法中最多有一个参数被 @SplitParam 注解。

开启功能

通过在入口类或配置类上增加 @EnableParamSplitter 注解开启功能。例如:

@EnableParamSplitter
@Configuration
public class xxConfig {
    //...
}

@EnableParamSplitter.order() 用来配置在同一连接点应用多个增强时的顺序,默认为最低优先级 Ordered.LOWEST_PRECEDENCE。在与其他 AOP 注解搭配时需注意调整。例如:

@EnableCaching(order = Ordered.LOWEST_PRECEDENCE - 1) //先取缓存所以提高优先级
@EnableParamSplitter
@Configuration
public class xxConfig {
    //...
}

注解方法参数

拆分集合

在方法的参数上加上注解,并配置数量限制。

public class FoxService {

    public Map<Integer, Foo> getMultiFoo(@SplitParam(3) Collection<Integer> fooIds) {
      // fooIds大小限制为3个
      //...
    }

    public List<Foo> getMultiFoo(@SplitParam(5) List<Integer> fooIds) {
      // fooIds大小限制为5个
      //...
    }
}

拆分对象

如果用一个类封装了所有参数,则在需要拆分的属性(可拆分)上增加本注解。

public class FoxService {

    public List<Foo> getMultiFoo(@SplitParam(5) SearchParam param) {
      // SearchParam.nums大小限制为5个
      //...
    }
}

public class SearchParam {

    @SplitParam(3)//若方法参数中没有设置chunkSize,则为3
    private final Collection<Integer> nums;
}

作为参数的类需要实现 Cloneable 接口,或拥有无参构造方法。
可拆分属性的类型还可以是一个可拆分的类,但注意不要引起死循环。

支持和扩展

参数分割

默认支持分割的方法参数类型如下:

  • 各种类型的数组
  • java.util.List、实现了 java.util.List 的类
  • java.util.Collection
  • java.util.Setjava.util.HashSet
  • 属性带@SplitParam注解的类

如果需要对更多类型进行分割可通过实现 SmartParamSplitterParamSplitterParamSplitterResolver 进行扩展。

结果合并

默认支持合并的返回值类型如下:

  • 各种类型的数组
  • java.util.Collection
  • java.util.Listjava.util.ArrayList
  • java.util.Setjava.util.HashSet
  • java.util.Mapjava.util.HashMap
  • java.lang.Void
  • java.lang.Boolean(与逻辑合并)
  • java.lang.Integer(求和)
  • java.lang.Long(求和)
  • 用支持的类型作为泛型的 CompletableFutureMono

如果需要对更多类型进行合并可以自行实现 SmartResultMergerResultMergerResolverResultMerger

工作原理

AOP

  1. 通过 @EnableParamSplitter 注解引入 ParamSplitterAutoConfiguration 配置类。
  2. ParamSplitterAutoConfiguration 配置类中定义 Bean
    • SplitParamOperationSource(用来生成 Pointcut)、SplitParamInterceptor(Advice);
    • 定义 SplitParamOperationSourceAdvisor(Advisor) 并注入前两个 Bean,生成 Pointcut。
  3. Spring 获取 Advisor 的 Pointcut,用所有方法做参数,循环调用 Pointcut 的 matches 方法,在匹配的方法上建立动态代理,当代理方法执行时调用 Advice(描述不严谨,大概这么个意思)。

开发总结

小知识点

  • ProxyMethodInvocation 是一个调用链,链上的每一个 Advice 只会执行一次。如果需要多次执行,需要用 invocableClone()invocableClone(Object... arguments)

相关文章

  • CRM项目07

    复习 @Param参数当有参数类型相同的时候parameterType判断不错参数使用哪一个,需要添加@Param...

  • 2019-11-19

    # 首先构造一个所有搜索参数的字典 parameters = {'splitter':('best','rando...

  • 一些JSdoc的规范

    (1)默认值 @param {number} [foo=1] (2) 可选参数 @param {number} ...

  • 分割地址栏中的字段

    function GetQueryString(param) { //param为要获取的参数名 注:获取不到...

  • 6-23 #init-param与 context-param# init-param(初始化参数)在 标签里进行...

  • 微信支付参数详情

    // 微信支付参数 /** * 微信APP支付 * @param body 商品描述 * @param o...

  • AFNetworking3.x版本的二次封装包含(GET、POS

    /** GET请求接口 @param url 请求接口@param parameters 接口传入参数内容@par...

  • mybatis 学习笔记

    1.mybatis返回主键的值:{ } 2.使用map或者@Param注解来解决多个接口参数的问题{·当接口对应的...

  • Mybatis报错Available parameters ar

    解决:在到层的参数中注入例如(@Param("ID")Long ID),不要改为arg0来识别,因为后期更改服务器...

  • TP5请求和相应

    推荐获取请求参数方法 $request->param()系统提供input助手,简化param()方法 TP中比较...

网友评论

    本文标题:Param Splitter 解决“大集合参数”

    本文链接:https://www.haomeiwen.com/subject/dezwhdtx.html