Skip to content

拆卸操作

huangchengxing edited this page Feb 15, 2023 · 1 revision

概述

日常中我们往往会遇到需要填充的对象中仍嵌套有其他对象的情况,针对 “把 A 字段里嵌套的对象取出并展开” 这一操作则称为拆卸操作。一次拆卸操作只会基于一个嵌套对象字段触发,一个对象进行装配操作前,可能需要经过多次拆卸操作。

一、声明

@Assemble 一样,拆卸操作和装配操作在配置解析过程中会被一起解析。通过 @Disassemble 声明一个拆卸操作。

1、在属性上声明

一般情况下,可以直接在某个需要拆卸的属性上通过注解声明一次操作:

public class Department {
    private Integer id;
    @Disassemble(type = Employee.class)
    private List<Employee> employees;
}

如上实例,在填充 Department 对象前,将会先把 Department 中的 Employee 对象全部取出并摊平,若 Employee 也有需要拆卸的嵌套对象,则会一并取出摊平,一致递归到所有的对象都平铺为止。

拆卸操作支持处理数组、Collection 集合或单个对象。

2、在类上声明

@Assemble 一样,@Disassemble 同样可以声明在类上:

@Operations(
    disassembles = @Disassemble(key = "employees", type = Employee.class))
)
public class Department {
    private Integer id;
    private List<Employee> employees;
}

当声明在类上时,需要通过 key 绑定需要拆卸的字段。

二、动态类型

有些时候无法在编译期就确定要填充的对象类型,此时可以不指定 type,而是等到执行拆卸时再动态的推断类型:

public class Department<T> {
    private Integer id;
    @Disassemble // 无法确定填充类型
    private List<T> employees;
}

相对固定类型的操作来说,性能会受到点影响。

该功能依赖类型解析器 TypeResolver 实现,用户可以实现接口替换默认的类型解析器。

三、装配操作处理器

所有的装配操作都通过拆卸操作处理器 DisassembleOperationHandler 完成处理,用户同样也可以在注解中选择:

public class Department {
    private Integer id;
    @Disassemble(
        type = Employee.class,
        handler = ReflectDisassembleOperationHandler.class // 指定操作处理器
    )
    private List<Employee> employees;
}

在配置解析过程中,会从 Spring 上下文根据指定的类型获取对应的操作处理器。

目前 AssembleOperationHandler 只提供了基于反射的 ReflectDisassembleOperationHandler 一种实现,用户可以自定义操作处理器,以便更好的支持其他类型的数据,或者提高处理器的执行效率。

Clone this wiki locally