DTO、VO、POJO、JavaBean 之间的区别?

2023-12-25

看到过一些类似的问题:

  • JavaBean 和 POJO 有什么区别? https://stackoverflow.com/questions/1394265/what-is-the-difference-between-a-javabean-and-a-pojo
  • POJO(普通Java对象)和DTO(数据传输对象)有什么区别? https://stackoverflow.com/questions/1425302/what-is-the-difference-between-pojo-and-dto

您还可以告诉我它们的使用环境吗?或者说他们的目的是什么?


JavaBeans

JavaBean 是一个如下的类JavaBeans 约定 http://www.oracle.com/technetwork/java/javase/documentation/spec-136004.html正如 Sun 所定义的。维基百科对什么有很好的总结JavaBeans http://en.wikipedia.org/wiki/JavaBean are:

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

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

所需的约定是:

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

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

POJO

普通旧 Java 对象或 POJO 是一个最初引入的术语,用于指定简单的轻量级 Java 对象,不实现任何javax.ejb接口,而不是重量级 EJB 2.x(尤其是实体 Bean,无状态会话 Bean 在我看来并没有那么糟糕)。今天,这个术语用于任何没有额外内容的简单对象。再次,维基百科在定义方面做得很好POJO http://en.wikipedia.org/wiki/Plain_Old_Java_Object:

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

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

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

这个词很可能已经获得了 广泛接受是因为 需要一个共同且容易的 理解与对比的术语 复杂的对象框架。 A JavaBean 是一个 POJO,它是 可序列化,无参数 构造函数,并允许访问 使用 getter 和 setter 的属性 方法。 Enterprise JavaBean 不是 单个类但整个组件 模型(同样,EJB 3 减少了 Enterprise JavaBeans 的复杂性)。

随着使用 POJO 的设计变得 更常用的是,系统有 的出现,为 POJO 提供了一些 框架中使用的功能和 对哪些领域有更多选择 实际需要的功能。 Hibernate 和 Spring 就是例子。

值对象

值对象或 VO 是这样的对象java.lang.Integer保存值(因此是值对象)。对于更正式的定义,我经常参考 Martin Fowler 的描述值对象 http://martinfowler.com/bliki/ValueObject.html:

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

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

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

早期的 J2EE 文献使用术语“值对象”来描述一个不同的概念,我称之为“值对象”数据传输对象 http://martinfowler.com/eaaCatalog/dataTransferObject.html。此后他们改变了用法并使用了这个术语传输对象 http://www.oracle.com/technetwork/java/transferobject-139870.html反而。

您可以在以下位置找到更多有关有价值对象的好材料wiki http://c2.com/cgi/wiki?ValueObject并由德克·里尔 http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.html.

数据传输对象

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

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

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

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DTO、VO、POJO、JavaBean 之间的区别? 的相关文章

  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • java程序有多少种结束方式?

    我知道使用 System exit 0 可以结束一个java程序 例如 如果我有一个JFrame窗口 它会关闭并结束程序 但我想知道还有多少其他方法 可以关闭它并结束程序 包括发生错误时 程序会被关闭 JFrame也会被关闭吗 添加到其他答
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 如何在 IntelliJ IDEA 中运行 akka actor

    来自 Akka 网站文档 然后 这个主要方法将创建所需的基础设施 运行演员 启动给定的主要演员并安排 一旦主要参与者终止 整个应用程序就会关闭 因此 您将能够使用类似于以下的命令运行上面的代码 下列的 java classpath akka
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐