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

2022-08-31 04:09:53

看到一些类似的问题:

您能否告诉我使用它们的背景?还是它们的目的?


答案 1

JavaBeans

JavaBean是一个遵循Sun定义的JavaBeans约定的类。维基百科对JavaBeans有一个很好的总结:

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

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

所需的约定是:

  • 该类必须具有公共默认构造函数。这允许在编辑和激活框架内轻松实例化。
  • 类属性必须按照标准命名约定使用 get、set 和其他方法(所谓的访问器方法和赋值器方法)进行访问。这允许在框架内轻松自动检查和更新Bean状态,其中许多框架包括各种类型属性的自定义编辑器。
  • 该类应该是可序列化的。这允许应用程序和框架以独立于 VM 和平台的方式可靠地保存、存储和还原 Bean 的状态。

由于这些要求主要表示为约定而不是通过实现接口,因此一些开发人员将 JavaBean 视为遵循特定命名约定的普通旧 Java 对象。

波霍

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

POJO是Plain Old Java Object的首字母缩写。该名称用于强调所讨论的对象是普通的Java对象,而不是特殊对象,特别是不是企业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 是保存值的对象(因此是值对象)。对于更正式的定义,我经常参考Martin Fowler对Value Object的描述:java.lang.Integer

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

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

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

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

你可以在wikiDirk Riehle上找到更多关于价值对象的好材料。

数据传输对象

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

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

数据传输对象与业务对象或数据访问对象之间的区别在于,除了存储和检索自己的数据(访问器和赋值器)之外,DTO 没有任何行为。

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


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


答案 2

数字电话与 VO

断续器 -数据传输对象只是用于在层和层之间传输数据的数据容器。

  • 它主要包含属性。您甚至可以在没有 getter 和 setter 的情况下使用公共属性。
  • 数据传输对象不包含任何业务逻辑。

类比:
简单的注册表单,其中包含用户名,密码和电子邮件ID的属性。

  • 当此表单在RegisterServlet文件中提交时,您将获得从视图层到业务层的所有属性,您可以在其中将属性传递给java bean,然后传递给DAO或持久性层。
  • DTO 有助于将属性从视图层传输到业务层,最后传输到持久层。

DTO主要用于通过网络有效地传输数据,它甚至可能从JVM到另一个JVM。

DTO通常是 - 为了在JVM之间传输数据。java.io.Serializable

VO -值对象 [1][2] 表示自身是一组固定的数据集,类似于 Java 枚举。值对象的标识基于其状态而不是其对象标识,并且是不可变的。一个真实世界的例子是Color.RED,Color.BLUE,。女性等

POJO vs JavaBeans

[1] POJO 的 Java-Beanness 在于它的私有属性都是通过符合 JavaBeans 约定的公共 getter 和 setter 访问的。例如:

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 

[2] JavaBeans必须实现可序列化,并有一个无参数构造函数,而在POJO中没有这些限制。