一尘不染

JavaDTO,VO,POJO,JavaBeans之间的区别?

java

DTO,VO,POJO,JavaBeans之间的区别?


阅读 762

收藏
2020-03-01

共1个答案

一尘不染

JavaBeans

JavaBean是遵循Sun定义的JavaBeans约定的类。Wikipedia很好地总结了什么是JavaBean:

JavaBean是Java的可重用软件组件,可以在构建器工具中直观地对其进行操作。实际上,它们是用Java编程语言编写的,符合特定约定的类。它们用于将许多对象封装到单个对象(bean)中,以便可以将它们作为单个bean对象而不是多个单个对象传递。JavaBean是可序列化的Java对象,具有null构造函数,并允许使用getter和setter方法访问属性。

为了充当JavaBean类,对象类必须遵守有关方法命名,构造和行为的某些约定。这些约定使拥有可以使用,重用,替换和连接JavaBean的工具成为可能。

所需的约定为:

该类必须具有公共默认构造函数。这样可以在编辑和激活框架内轻松实例化。
必须遵循标准命名约定,使用get,set和其他方法(所谓的accessor方法和mutator方法)访问类属性。这样可以轻松自动地检查和更新框架中的Bean状态,其中许多框架都包含针对各种类型的属性的自定义编辑器。
该类应可序列化。这允许应用程序和框架以独立于VM和平台的方式可靠地保存,存储和还原Bean的状态。
因为这些需求主要通过约定而不是通过实现接口来表达,所以某些开发人员将JavaBeans视为遵循特定命名约定的Plain Old Java Object。

POJO

普通旧Java对象或POJO是最初引入的一个术语,用于指定简单的轻量级Java对象,而不实现任何javax.ejb接口,而不是重量级的EJB 2.x(特别是实体Bean,无状态会话Bean并不是那么糟糕的IMO)。今天,该术语用于任何没有多余东西的简单对象。同样,维基百科在定义POJO方面做得很好:

POJO是Plain Old Java Object的首字母缩写。该名称用来强调所讨论的对象是普通的Java对象,而不是特殊的对象,尤其不是Enterprise JavaBean(尤其是在EJB 3之前)。这个词是由马丁·福勒(Martin Fowler),丽贝卡·帕森斯(Rebecca Parsons)和乔什·麦肯齐(Josh MacKenzie)在2000年9月创造的:

“我们想知道为什么人们不反对在他们的系统中使用常规对象,并得出结论,这是因为简单对象缺乏奇特的名称。所以我们给了他们一个名称,并且很好地流行了。”

对于未使用新功能的技术,例如电话中的POTS(普通老式电话服务)和C ++中定义但仅使用C语言功能的PODS(普通老式数据结构),该术语延续了较旧术语的模式。和Perl中的POD(普通旧文档)。

该术语很可能已被广泛接受,因为需要与复杂的对象框架形成对比的通用且易于理解的术语。JavaBean是可序列化的POJO,具有无参数构造函数,并允许使用getter和setter方法访问属性。Enterprise JavaBean不是单个类,而是整个组件模型(同样,EJB 3降低了Enterprise JavaBeans的复杂性)。

随着使用POJO的设计变得越来越普遍,出现了一些系统,这些系统为POJO提供了框架中使用的某些功能,并为实际需要的功能领域提供了更多选择。Hibernate和Spring是示例。

价值对象

值对象或VO是诸如java.lang.Integer持有值之类的对象(因此为值对象)。对于更正式的定义,我经常参考Martin Fowler对Value Object的描述:

在《企业应用程序体系结构模式》中,我将值对象描述为一个小对象,例如货币或日期范围对象。它们的关键特性是它们遵循值语义而不是引用语义。

您通常可以告诉他们,因为它们的相等性概念不是基于身份的,而是如果两个值对象的所有字段都相等,则它们相等。尽管所有字段都相等,但是如果子集是唯一的,则无需比较所有字段-例如,货币对象的货币代码足以测试相等性。

一般的启发式方法是价值对象应该完全不可变。如果要更改值对象,则应使用新对象替换该对象,并且不允许更新该值对象本身的值-可更新的值对象会导致混叠问题。

早期的J2EE文献使用值对象这个术语来描述一个不同的概念,我称之为数据传输对象。此后,他们改变了用法,改用术语“ 传输对象”。

您可以在Wiki 和Dirk Riehle的有价值的对象上找到更多的好材料。

数据传输对象

数据传输对象或DTO是EJB引入的(反)模式。它不是在EJB上执行许多远程调用,而是将数据封装在可以通过网络传输的值对象中:数据传输对象。维基百科对数据传输对象有一个不错的定义:

数据传输对象(DTO),以前称为值对象或VO,是一种设计模式,用于在软件应用程序子系统之间传输数据。DTO通常与数据访问对象结合使用,以从数据库中检索数据。

数据传输对象与业务对象或数据访问对象之间的区别在于,DTO除了存储和检索自己的数据(访问者和变异者)外,没有其他行为。

在传统的EJB体系结构中,DTO具有双重目的:首先,它们解决了实体bean无法序列化的问题;其次,它们隐式定义一个组装阶段,在该阶段中,将视图使用的所有数据都提取并编组到DTO中,然后再将控制权返回到表示层。

因此,对于许多人来说,DTO和VO是同一回事(但Fowler使用VO表示我们所看到的其他含义)。大多数时候,它们遵循JavaBeans约定,因此也是JavaBean。而且都是POJO。

2020-03-01