Skip to content

自动填充

huangchengxing edited this page Feb 15, 2023 · 1 revision

概述

一般情况下,crane4j 将在代码里面使用 OperateTemplate 或者 BeanOperationExecutor 完成的填充操作称为手动填充,对应的,基于 SpringAOP 提供的在切面中自动完成方法入参与返回值填充的操作称为自动填充。

image-20230210134351459

一、自动填充方法返回值

1、使用

基于 SpringAOPcrane4j 提供了用于自动填充方法返回值的切面类 MethodResultAutoOperateAspect,当我们在方法上添加 @AutoOperate 后,即可在方法返回时对返回值进行自动填充:

@AutoOperate(type = Foo.class)
public List<Foo> getFooList() {
    // do nothing
}

返回值类型可以是单个对象、对象数组或对象的 Collection 集合。

2、包装类提取

在一般的业务场景中,我们往往会将注解添加在 Controller 中的方法上,而这些方法的返回值有经常会使用通用响应体包装,比如:

public class Result<T> {
    private Integer code;
    private T data;
}

@AutoOperate(type = Foo.class)
public Result<List<Foo>> getFooList() {
    // do nothing
}

上述方法实际上需要填充的对象不是 Result,而是 Result 中的 data。除了在 data 上添加 @Disassemble 注解声明拆卸外,还可以直接通过 AutoOperate.on 指定提取特定属性值进行填充,比如:

@AutoOperate(type = Foo.class, on = "data")
public Result<List<Foo>> getFooList() {
    // do nothing
}

3、应用条件表达式

通过注解的 condtion 可以设置应用条件的表达式,在执行填充前,将会根据表达式的计算结果确定是否要执行这次填充,比如:

@AutoOperate(type = Foo.class, condition ="#result.size > 0 && #type != 1")
public List<Foo> getFoo(Integer type) {
    // do nothing
}

上述示例表示仅当 方法返回值不为空,且入参的 type 不为 1 时 才执行填充。

默认的表达式引擎为 SpEL 表达式,因此可以在里面可以通过 #result 引用返回值,并通过 #参数名 引用方法入参,返回值可以是 boolean 值,或者 'true''false' 字符串。

若有必要,用户也可以基于 MethodBaseExpressionEvaluator 扩展并替换默认的实现。

4、分组填充

通过注解的 includes 或者 excludes 属性可以设置本次执行的操作组,比如:

@AutoOperate(type = Foo.class, includes = {"base", "foo"},)
public List<Foo> getFoo(Integer type) {
    // do nothing
}

上述示例中,当进行填充时,仅会完成 Foo@Assemble.groups@Disassemble.groups 带有 basefoo 的装配/拆卸操作。

5、指定执行器

通过注解的 executor 可以指定本次填充操作的执行器:

@AutoOperate(type = Foo.class, executor = OrderedBeanOperationExecutor.class)
public List<Foo> getFoo(Integer type) {
    // do nothing
}

当执行填充时,会从 Spring 上下文中根据类型获得对应的执行器,不同的执行器将会为操作带来不同的影响,比如上述示例指定的 OrderedBeanOperationExecutor.class 支持按规定的顺序同步的完成填充,而 AsyncBeanOperationExecutor 则支持并发填充。

二、自动填充方法参数

基于 SpringAOPcrane4j 提供了用于自动填充方法返回值的切面类 MethodArgumentAutoOperateAspect,当我们在方法上添加 @ArgAutoOperate 后,即可在方法执行前对入参进行自动填充:

// 1.注解注解在参数上
@ArgAutoOperate
public void getFooList(@AutoOperate(type = Foo.class) Foo foo) {
    // do nothing
}

// 2.注解在方法上
@ArgAutoOperate(@AutoOperate(value = "foo", type = Foo.class))
public void getFooList(Foo foo) {
    // do nothing
}

除了方法必须添加 @ArgAutoOperate 外,用户可以选择直接在 @ArgAutoOperate 注解的 value 属性里面声明填充,也可以在直接在方法参数前添加注解声明填充,两者声明方式效果是一样的,也可以混用。

与返回值填充一样,填充的数据可以是单个对象、对象数组或对象的 Collection 集合类型的参数,同时也支持包括包装类提取、应用条件表达式以及分组等在内,返回值自动填充支持的全部功能