本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
DTO,VO,POJO,JavaBeans之间的区别?
看过一些类似的问题:
JavaBean和POJO有什么区别?
POJO(普通的旧Java对象)和DTO(数据传输对象)之间有什么区别?
您还可以告诉我使用它们的上下文吗?还是他们的目的?
高分回答:
JavaBeans
JavaBean是遵循Sun定义的JavaBeans约定的类。Wikipedia很好地总结了什么是JavaBean:
JavaBean是Java的可重用软件组件,可以在构建器工具中直观地对其进行操作。实际上,它们是用Java编程语言编写的,符合特定约定的类。它们用于将许多对象封装到单个对象(bean)中,以便可以将它们作为单个bean对象而不是多个单个对象传递。JavaBean是可序列化的Java对象,具有null构造函数,并允许使用getter和setter方法访问属性。
为了充当JavaBean类,对象类必须遵守有关方法命名,构造和行为的某些约定。这些约定使拥有可以使用,重用,替换和连接JavaBean的工具成为可能。
所需的约定为:
该类必须具有公共默认构造函数。这样可以在编辑和激活框架内轻松实例化。 必须遵循标准命名约定,使用get,set和其他方法(所谓的accessor方法和mutator方法)访问类属性。这样可以轻松自动地检查和更新框架中的Bean状态,其中许多框架都包含针对各种类型的属性的自定义编辑器。 该类应可序列化。这允许应用程序和框架以独立于VM和平台的方式可靠地保存,存储和还原Bean的状态。
因为这些需求主要通过约定而不是通过实现接口来表示,所以某些开发人员将JavaBeans视为遵循特定命名约定的Plain Old Java Object。
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
值对象或VO是诸如java.lang.Integer持有值之类的对象(因此为值对象)。对于更正式的定义,我经常参考Martin Fowler对Value Object的描述:
在《企业应用程序体系结构模式》中,我将值对象描述为一个小对象,例如货币或日期范围对象。它们的关键特性是它们遵循值语义而不是引用语义。
您通常可以告诉他们,因为它们的相等性概念不是基于身份的,相反,如果两个值对象的所有字段都相等,则它们相等。尽管所有字段都相等,但是如果子集是唯一的,则无需比较所有字段-例如,货币对象的货币代码足以测试相等性。
一般的启发式方法是,价值对象应该是完全不变的。如果要更改值对象,则应使用新对象替换该对象,并且不允许更新该值对象本身的值-可更新的值对象会导致混叠问题。
早期的J2EE文献使用术语“值对象”来描述一个不同的概念,我称之为“数据传输对象”。此后,他们改变了用法,改用术语“传输对象”。
您可以在Wiki和Dirk Riehle的有价值的对象上找到更多的好材料。
DTO
数据传输对象或DTO是EJB引入的(反)模式。它不是在EJB上执行许多远程调用,而是将数据封装在可以通过网络传输的值对象中:数据传输对象。维基百科对数据传输对象有一个不错的定义:
数据传输对象(DTO),以前称为值对象或VO,是一种设计模式,用于在软件应用程序子系统之间传输数据。DTO通常与数据访问对象结合使用,以从数据库中检索数据。
数据传输对象与业务对象或数据访问对象之间的区别在于,DTO除了存储和检索其自己的数据(访问者和变异者)外,没有其他行为。
在传统的EJB架构中,DTO具有双重目的:首先,它们解决了实体bean无法序列化的问题;其次,它们隐式定义一个组装阶段,在该阶段中,将视图使用的所有数据都提取并编组到DTO中,然后再将控制权返回到表示层。
因此,对于许多人来说,DTO和VO是同一回事(但Fowler使用VO表示我们所看到的其他含义)。大多数时候,它们遵循JavaBeans约定,因此也是JavaBean。而且都是POJO。
高分回答:
DTO与VO
DTO-数据传输对象只是用于在层和层之间传输数据的数据容器。
它主要包含属性。您甚至可以使用没有getter和setter的公共属性。 数据传输对象不包含任何业务逻辑。
类推: 具有属性用户名,密码和电子邮件ID的简单注册表单。
当此表单在RegistrationServlet文件中提交时,您将获得从视图层到业务层的所有属性,然后在其中将属性传递给Java Bean,然后传递给DAO或持久层。 DTO帮助将属性从视图层传输到业务层,最后到持久层。
DTO主要用于有效地跨网络传输数据,甚至可能从JVM到另一个JVM。
DTO通常java.io.Serializable-为了跨JVM传输数据。
VO-值对象本身表示一组固定的数据,并且类似于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中则没有这些限制。
文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…
**作者建议:数据传输对象DTO,VO值对象,本身表示一组固定的数据 **
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️