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。