Java对象分层详解
概念:
POJO(Plain Old Java Object)
直译:纯洁老式的Java对象 ,通常表示为简单的Java对象。
VO(View Object)
直译:视图对象,用于前端展示层(如Controller),它的作用是把某个指定页面(或组件)的所有数据封装起来,返回给前端。
DTO(Data Transfer Object)
直译:数据传输对象,通常作为方法入参来使用。在此仅泛指用于展示层(如Controller)与服务层(如service/Impl)之间的数据传输对象。对其J2EE设计模式内的作用不做深入探讨。
DO(Domain Object)
直译:领域对象,不是简单的POJO对象,而是从现实世界中抽象出来的有形或无形的业务实体。
PO(Persistent Object)
直译:持久化对象,通常与持久层(DAO,通常是关系型数据库)的数据结构形成一一对应的映射关系。
区别:
VO与DTO的区别:
DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。
DTO与DO的区别:
首先是概念上的区别,DTO是展示层和服务层之间的数据传输对象,而DO是对现实世界各种业务角色的抽象,这就引出了两者在数据上的区别。
例如:UserInfo(DO)和User(DTO),对于一个getUser()方法来说,本质上它永远不应该返回用户的密码,因此UserInfo至少比User少一个password的字段。而在领域驱动设计中,正如上文描述DO不是简单的POJO,重点在于领域业务逻辑。
DO与PO的区别:
DO和PO在绝大部分情况下是一一对应的,PO是只含有get/set方法的POJO,但某些场景还是能反映出两者在概念上存在本质的区别,PO是需要持久化的,与数据库息息相关,而DO是业务上的,具有业务逻辑。
总结:
DTO(Data Transfer Object) | 前端入参,服务层需要接收的数据和返回的数据 |
---|---|
PO(Persistent Object) | 实体类,数据库返回对象,并没有额外操作 |
DO (Domain Object) | 服务之间互相调用传递的对象,为PO赋予业务属性 |
VO (View Object) | 前端响应对象response |
POJO(Plain Old Java Object) | 简单的Java对象 |
笔者在总结出这个表格前查询了大量资料,很多开发者认为:Spring越来越冗余,Java对象规范也毫无必要,但笔者认为:Spring的开发理念就在于解决企业级JavaEE项目,真实的线上项目环境、问题错综复杂,一个小小的错误都将是致命的。个人的思想若以团队的规范为优先则可以最大程度的去规避这些错误。