-
Notifications
You must be signed in to change notification settings - Fork 33
拆卸操作
日常中我们往往会遇到需要填充的对象中仍嵌套有其他对象的情况,针对 “把 A 字段里嵌套的对象取出并展开” 这一操作则称为拆卸操作。一次拆卸操作只会基于一个嵌套对象字段触发,一个对象进行装配操作前,可能需要经过多次拆卸操作。
与 @Assemble
一样,拆卸操作和装配操作在配置解析过程中会被一起解析。通过 @Disassemble
声明一个拆卸操作。
一般情况下,可以直接在某个需要拆卸的属性上通过注解声明一次操作:
public class Department {
private Integer id;
@Disassemble(type = Employee.class)
private List<Employee> employees;
}
如上实例,在填充 Department
对象前,将会先把 Department
中的 Employee
对象全部取出并摊平,若 Employee
也有需要拆卸的嵌套对象,则会一并取出摊平,一致递归到所有的对象都平铺为止。
拆卸操作支持处理数组、Collection
集合或单个对象。
与 @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
一种实现,用户可以自定义操作处理器,以便更好的支持其他类型的数据,或者提高处理器的执行效率。