【问题标题】:Difference between DTO, VO, POJO, JavaBeans?DTO、VO、POJO、JavaBeans 的区别?
【发布时间】:2010-12-09 09:35:11
【问题描述】:

看过一些类似的问题:

你能告诉我它们的使用环境吗?还是他们的目的?

【问题讨论】:

  • POJO 没有限制,而 javabeans 有上面提到的限制

标签: java terminology javabeans dto pojo


【解决方案1】:
  • 值对象:当需要根据对象的值来衡量对象的相等性时使用。
  • 数据传输对象:将具有多个属性的数据一次从客户端跨层传递到服务器,以避免多次调用远程服务器。
  • Plain Old Java Object :它就像简单的类,具有属性,公共无参数构造函数。正如我们为 JPA 实体声明的那样。

difference-between-value-object-pattern-and-data-transfer-pattern

【讨论】:

    【解决方案2】:

    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 中没有这些限制。

    【讨论】:

    • 抱歉评论太晚了,但我正在了解它们之间的差异,我有一个问题。如果我有一个 Java Bean 类,但使用了另一种方法,如 doSomething()。会是一个什么样的班级?问候
    • @srinivas 为什么我们不能在 DOMAIN 或 MODEL java 对象中传递数据?但我使用没有 DTO 的模型。请简要解释一下。谢谢
    【解决方案3】:

    第一次谈

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

    然后谈谈最后一个 POJO

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

    【讨论】:

    • 如问题所问,VO 怎么样?在回答完整问题之前,这不是答案
    【解决方案4】:

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

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

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

    【讨论】:

    • 如问题所问,VO 怎么样?在回答完整问题之前,这不是答案
    【解决方案5】:

    Java Bean 与 EJB 不同。

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

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

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

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

    POJO 是对 EJB 的一种反应。

    【讨论】:

    • 我错了,我更愿意删除我的消息。谢谢指正。我想注意到 POJO 的含义在前一段时间发生了变化。首先,它们仅由私有属性及其访问器组成。现在,我们将 POJO 视为具有注释、实现和扩展其他类等的类。
    • 如问题所问,VO 怎么样?在回答完整问题之前,这不是答案
    【解决方案6】:

    JavaBeans

    JavaBean 是遵循 Sun 定义的 the JavaBeans conventions 的类。 Wikipedia 对 JavaBeans 的含义做了很好的总结:

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

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

    所需的约定是:

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

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

    POJO

    Plain Old Java Object 或 POJO 是最初引入的一个术语,用于指定一个简单的轻量级 Java 对象,不实现任何 javax.ejb 接口,与重量级 EJB 2.x(尤其是实体 Bean,无状态会话 Bean)相反糟糕的国际海事组织)。今天,该术语用于任何没有额外内容的简单对象。同样,维基百科在定义POJO 方面做得很好:

    POJO 是 Plain Old Java 的首字母缩写词 目的。这个名字是用来强调的 有问题的对象是 普通的 Java 对象,不是特殊的 对象,特别是不是 Enterprise JavaBean(尤其是之前 EJB 3).这个词是马丁创造的 福勒、丽贝卡·帕森斯和乔希 2000 年 9 月的麦肯齐:

    “我们想知道为什么人们如此反对在他们的 系统,并得出结论,它是 因为简单的物体缺乏花哨 姓名。所以我们给了他们一个,它是 非常受欢迎。”

    这个词延续了 旧的技术术语 不要使用花哨的新功能,例如 POTS(普通旧电话服务)在 电话和 PODS(普通旧数据 结构)在 C++ 中定义 但仅使用 C 语言功能,并且 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 文献使用术语值对象来描述不同的概念,我称之为Data Transfer Object。此后,他们改变了用法,改用 Transfer Object 这个词。

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

    数据传输对象

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

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

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

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


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

    【讨论】:

    • 因此,如果我创建了一个便利类,仅用于在具有很多复杂逻辑的类中传输像 class SomeClass { public String foo;public String bar; } 这样的不相关数据,确定它不是 JavaBean,它不可能是一个VO,因为它是可变的,它可以是一个DTO吗?尽管它不是针对任何类型的远程调用的。可以认为是 POJO 吗?
    • @user2601512:它仍然是一个 Bean。 :P Bean 的行为并没有错——事实上,这是意料之中的。如果它什么都不做,它基本上就是一个 DTO。
    • @xSNRG:部分是因为它将对象降级为其他代码所作用的数据。从面向对象的角度来看,这是一个倒退,对象在其中起作用并且应该对自己的状态负责。如果您实际上只是在传输数据(因此得名),DTO 有时是一个不错的解决方案,但封装基本上会消失,并且您通常会失去真实对象可以提供的任何有效性/一致性保证。
    • @KumaresanPerumal:如果你愿意,你可以。但模型不同于数据层,具有不同的目标和规则。数据层通常需要布局和任意设置的所有内容,并且模型理想地希望隐藏数据并强制执行不变量。您想使用模型对象进行存储,您将不得不在一侧或另一侧做出妥协。
    • @KumaresanPerumal:数据层用于存储和检索数据。要做到这一点,它几乎需要完全访问保存数据的任何对象,因为检索意味着在某个对象中设置值。但是该模型管理系统内的数据,并受 OO 原则的约束,例如封装——对象应该保持对其内部状态的控制并且有其他代码随意乱搞它们的内部状态的想法. DTO 可以弥补这一差距;数据层可以随意访问,模型不用放弃控制权。
    【解决方案7】:

    基本上,

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

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

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

    Java Beans:需要 Java Class 可序列化,具有 no-arg 构造函数以及每个字段的 getter 和 setter

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多