Pas*_*ent 821

的JavaBeans

JavaBean是遵循Sun定义的JavaBeans约定的类.维基百科对JavaBeans的概述有很好的总结:

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

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

所需的约定是:

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

因为这些需求主要表示为约定而不是实现接口,所以一些开发人员将JavaBeans视为遵循特定命名约定的Plain Old Java Objects.

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是一个对象,例如java.lang.Integer保存值(因此为值对象).对于更正式的定义,我经常提到Martin Fowler对Value Object的描述:

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

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

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

早期的J2EE文献使用术语值对象来描述不同的概念,我称之为数据传输对象.从那以后,他们改变了用法并使用了" 转移对象 "一词.

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

数据传输对象

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

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

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

在传统的EJB体系结构中,DTO具有双重目的:首先,它们解决了实体bean不可序列化的问题; 第二,它们隐式定义了一个汇编阶段,其中在将控制权返回给表示层之前,将视图使用的所有数据提取并编组到DTO中.


所以,对于很多人来说,DTO和VO是一回事(但是Fowler使用VO来表示我们所看到的其他东西).大多数时候,它们遵循JavaBeans约定,因此也是JavaBeans.所有人都是POJO.

  • @xSNRG:部分原因是它将对象降级为其他代码所依赖的数据.从面向对象的角度来看,这是一个倒退,对象的行为应该对自己的状态负责.如果您实际上只是传输数据(因此名称),DTO偶尔会是一个不错的解决方案,但封装基本上会超出窗口,您通常会失去真实对象可以提供的任何有效性/一致性保证. (7认同)
  • @ user2601512:它仍然是一个Bean.:P具有行为的Bean没有任何问题 - 实际上,它是非常期待的.如果它没有别的,它基本上是一个DTO. (3认同)
  • @KumaresanPerumal:数据层用于存储和检索数据。为此,几乎需要完全访问保存数据的任何对象,因为检索意味着在某个对象中设置值。但该模型管理系统内的数据,并受到面向对象原则的约束,例如封装,即对象应该保持对其内部状态的控制,并且_不_有其他代码任意乱搞其内部结构。DTO 可以弥补这一差距;数据层可以随意访问它们,模型不必放弃控制。 (2认同)

Sri*_*.V. 61

DTO vs 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-Bean是它的私有属性都是通过符合JavaBeans约定的公共getter和setter访问的.例如

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 
Run Code Online (Sandbox Code Playgroud)

[2] JavaBeans必须实现Serializable并且具有无参数构造函数,而在POJO中没有这些限制.


小智 44

基本上,

DTO:"数据传输对象"可以在软件架构中的单独层之间传输.

VO:"值对象"包含一个对象,如整数,金钱等.

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

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


duf*_*ymo 24

Java Bean与EJB不同.

Java 1.0中的JavaBeans规范是Sun试图允许在看起来像VB的IDE中操作Java对象的尝试.为符合"Java Bean"标准的对象制定了规则:

  1. 默认构造函数
  2. 遵循正确命名约定的私有数据成员的getter和setter
  3. 序列化
  4. 也许其他人,我忘了.

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

DTO在Java环境中出现,因为人们发现EJB 1.0规范对数据库来说过于"讨厌".人们不是为每个数据元素进行往返,而是将它们批量打包到Java Bean中并运送它们.

POJO是对EJB的反应.


小智 7

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

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

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


Atu*_*ain 7

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

值对象模式与数据传输模式之间的差异