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 之间的区别? 的相关文章

  • JSF2.0 中的空白输入字段未设置为 NULL

    我有一个支持 bean 其中 fileld 为 Long Double Integer String 当我没有在输入字段中指定任何内容时 长整型 整数和双精度值将被视为零 而不是空 我正在使用 tomcat 来部署我的应用程序 有什么解决办
  • 合并 2 个 .jks 信任库文件

    我正在使用启用了 SSL 的 Tomcat 并使用信任库进行客户端身份验证 我有两个 jks trustore 文件 第一个 我将其用于 PROD 环境 另一个用于 TEST 环境客户端证书 我在 Tomcat 上部署了 Web 应用程序
  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • 在 Gradle 中运行自定义测试任务而无需重新编译

    我有一个 Gradle 自定义测试任务来运行我的集成测试 我希望能够在 Gradle 不自动完成之前的所有阶段并仅运行测试的情况下运行它 有没有办法在每个构建步骤不使用 x 的情况下执行此操作 None
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 调试器不会停止在 Intellij IDEA 中的源代码处

    我有一个相当奇怪的问题 无法使用 Intellij IDEA 解决 我正在解析电子邮件文件org apache james mime4j包裹 但我的邮件文件格式不兼容Date 标头 因此 我从 mime4j 源创建了模块 并从磁盘中删除了
  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 如何注册 org.springframework.integration.monitor.IntegrationMBeanExporter

    根据http www ibm com support knowledgecenter en SS7K4U 8 5 5 com ibm websphere nd multiplatform doc ae cspr data access tr
  • 如何从 Java 生产代码中删除调试语句

    编译器是否可以从生产代码中删除用于调试目的 例如日志记录 的语句 调试语句需要以某种方式进行标记 可能使用注释 设置属性 debug true 并在每个调试语句中检查它很容易 但这会降低性能 如果编译器能够简单地使调试语句消失 那就太好了
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • java springrabbit - 优雅地拒绝消息

    我有以下侦听器方法 Override public void onMessage Message message Channel channel try do something bad catch Exception e try long
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • Android 中 Bitmap 和 Drawable 有什么区别?

    我用谷歌搜索 但找不到任何文章来描述 Android 中 Bitmap 和 Drawable 之间的区别 位图是位图图像的表示 类似于 java awt Image Drawable 是 可以绘制的东西 的抽象 它可能是一个位图 包装为Bi
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • Java 中有类似 .NET 的 NotImplementedException 的东西吗?

    有没有类似 NET 的东西NotImplementedException在Java中 康芒斯朗 http commons apache org proper commons lang javadocs api 2 6 org apache
  • 与手动搜索列表相比,Collections.binarySearch 的性能如何?

    我想知道该使用哪一个 我有一份学生名单 我想用他的名字搜索一个学生 到目前为止 我是通过迭代列表手动完成的 如下所示 for int i 0 i lt list size i Student student list get i if st
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐