650

看过一些类似的问题:

能否请您告诉我使用它们的上下文?还是他们的目的?

4

7 回答 7

923

JavaBeans

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

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

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

所需的约定是:

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

因为这些要求主要是作为约定而不是通过实现接口来表达的,所以一些开发人员将 JavaBeans 视为遵循特定命名约定的普通 Java 对象。

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 文献使用术语值对象来描述一个不同的概念,我称之为数据传输对象。此后,他们改变了用法并改用术语传输对象

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

数据传输对象

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

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

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

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


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

于 2009-10-23T10:51:33.173 回答
76

DTO 与 VO

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

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

类比:
具有用户名、密码和电子邮件 ID 属性的简单注册表单。

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

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

DTO 通常java.io.Serializable是为了跨 JVM 传输数据。

VO -值对象 [1][2] 表示自己是一组固定的数据,类似于 Java 枚举。值对象的标识基于它们的状态而不是它们的对象标识,并且是不可变的。一个真实的例子是 Color.RED、Color.BLUE、SEX.FEMALE 等。

POJO 与 JavaBeans

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

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

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

于 2009-10-23T10:31:33.150 回答
60

基本上,

DTO:“数据传输对象”可以在软件架构中的不同层之间传播。

VO:“值对象”包含一个对象,例如 Integer、Money 等。

POJO:Plain Old Java Object,不是特殊对象。

Java Beans:要求 aJava Class是可序列化的,no-arg每个字段都有一个构造函数和一个 getter 和 setter

于 2013-07-15T09:49:16.273 回答
25

Java Bean 与 EJB 不同。

Java 1.0 中的JavaBeans 规范是 Sun 尝试允许在类似于 VB 的 IDE 中操作 Java 对象。为符合“Java Bean”条件的对象制定了规则:

  1. 默认构造函数
  2. 遵循正确命名约定的私有数据成员的 getter 和 setter
  3. 可序列化
  4. 也许其他我忘记了。

EJB 是后来出现的。它们结合了分布式组件和事务模型,在管理线程、池、生命周期和提供服务的容器中运行。它们与 Java Bean 相去甚远。

DTO 出现在 Java 环境中是因为人们发现 EJB 1.0 规范对数据库过于“啰嗦”。人们不会对每个数据元素进行往返,而是将它们批量打包到 Java Bean 中并四处发送。

POJO 是对 EJB 的一种反应。

于 2009-10-23T10:17:34.130 回答
7

POJO:它是一个 java 文件(类),它不扩展或实现任何其他 java 文件(类)。

Bean:它是一个 java 文件(类),其中所有变量都是私有的,方法是公共的,并且适当的 getter 和 setter 用于访问变量。

普通类:它是一个 java 文件(类),它可能由公共/私有/默认/受保护的变量组成,并且可能会或可能不会扩展或实现另一个 java 文件(类)。

于 2016-08-17T05:00:11.157 回答
4
  • 值对象:当需要根据对象的值来衡量对象的相等性时使用。
  • 数据传输对象:一次将具有多个属性的数据从客户端跨层传递到服务器,以避免对远程服务器的多次调用。
  • 普通的旧 Java 对象:它就像简单的类,具有属性,公共无参数构造函数。正如我们为 JPA 实体声明的那样。

值对象模式和数据传输模式之间的差异

于 2019-05-03T13:09:53.233 回答
3

首先谈谈

普通类 -这意味着任何在 java 中通常定义的类都意味着您创建不同类型的方法属性等。
Bean - Bean 什么都不是,它只是使用此 bean 的特定类的对象,您可以访问与对象相同的 java 类。.

然后谈谈最后一个 POJO

POJO - POJO是没有任何服务的类,它只有一个默认构造函数和私有属性以及用于设置值对应的 setter 和 getter 方法的那些属性。它是普通 Java 对象的缩写形式。

于 2017-12-15T09:25:44.053 回答