分层领域模型(DO/PO/VO/BO/DTO/Query等概念)
1. 为什么会有这么多O的概念?
各种分层概念的提出都是为了解耦,增加逻辑/代码的复用,便于后期维护/开发,提高团队开发效率;but,过多的细分也会使得开发过程相对复杂,模型之间转换频繁,影响效率;
2. 怎么区分这些个O?
《阿里开发手册》提供的分层领域模型规约:
⚫ DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
⚫ DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
⚫ BO(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。
⚫ Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。
⚫ VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
⚫ PO(Persistent Object):指数据库表一 一对应的 POJO 类。此对象与数据库表结构一 一对应,通过 DAO 层向上
传输数据源对象,即Entity。
⚫POJO(Plain Ordinary Java Object):在本规约中,POJO 专指只有 setter / getter / toString 的简单类,包括
DO / DTO / BO / VO 等。
实际上,在给出的参考中并没有对模型对象进行非常明确的划分,特别是对BO、AO(Application Object)、DTO的界限不是非常明确。这也是因为系统处理的业务不同、复杂度不同导致的。所以在设计系统分层和建模的时候,需要综合考虑实际应用场景。
各个领域模型在分层上的传输关系大概是这样:
3. 常用转换工具类
各种分层,各种O,难免需要对象之前的转换,常用转换工具类:
一个是 org.springframework.beans.BeanUtils 包下的,一个是org.apache.commons.beanutils.BeanUtils 包下的
//org.springframework.beans.BeanUtils
public static void copyProperties(Object source, Object target){....}
//org.apache.commons.beanutils.BeanUtils
public static void copyProperties(Object dest,Object orig){....}
注意:
-
(1) org.apache.commons.beanutils.BeanUtils 和 org.springframework.beans.BeanUtils两个包中的 copyProperties 方法目标对象和源对象参数的位置是相反的。
-
(2) 使用org.apache.commons.beanutils.BeanUtils进行copy对象时,被copy的对象(source/orig)中包含的字段目标对象(target/dest)必须包含,可以有其他的多于字段,类型可以不相同,但字段名称必须一
致;org.springframework.beans.BeanUtils中的没有这个限制。 -
(3) BeanUtils.copyProperties使用起来虽然方便,但是它其实只是浅拷贝,所以类中都是单一的属性,像咱们上边介绍的,可以直接用;如果类中包含有其他的子类就需要考虑下拷贝后目标对象(target/dest)中包含被copy的对象(source/orig)中的子类是否有可能被修改,如果有可能被修改就不能直接使用。
.
.
.
参考:
- https://www.jianshu.com/p/a7f56a9b9c33/
- https://blog.csdn.net/qgnczmnmn/article/details/109384632
- https://zhuanlan.zhihu.com/p/102389552