JavaBean和POJO有什么区别?

时间:2009-09-08 14:11:57

标签: java terminology pojo

我不确定区别。我正在使用Hibernate,在某些书籍中,他们使用JavaBean和POJO作为可互换的术语。我想知道是否存在差异,不仅仅是在Hibernate上下文中,而是作为一般概念。

9 个答案:

答案 0 :(得分:242)

JavaBean遵循某些约定。 Getter / setter命名,具有公共默认构造函数,可序列化等。有关详细信息,请参阅JavaBeans Conventions

没有严格定义POJO(普通旧Java对象)。它是一个Java对象,它不需要实现特定的接口或从特定的基类派生,或者使用特定的注释以便与给定的框架兼容,并且可以是任意的(通常相对简单) Java对象。

答案 1 :(得分:100)

所有JavaBeans都是POJO,但并非所有POJO都是JavaBeans。

JavaBean是一个满足某些编程约定的Java对象:

  • JavaBean类必须实现Serializable或Externalizable;
  • JavaBean类必须具有公共的无参数构造函数;
  • 所有JavaBean属性必须具有公共setter和getter方法(视情况而定);
  • 所有JavaBean实例变量都应该是私有的。

答案 2 :(得分:22)

根据Martin Fowler的说法,POJO是一个封装业务逻辑的对象,而Bean(除了在其他答案中已经说明的定义除外)只不过是用于保存数据的容器,而对象上的可用操作仅仅是设置和获取数据

  

这个词是在Rebecca Parsons,Josh MacKenzie和我的时候创造出来的   准备在2000年9月的一次会议上发表演讲。在谈话中我们   指出了编写业务逻辑的许多好处   常规的Java对象,而不是使用Entity Beans。我们想知道为什么   人们反对在他们的系统中使用常规对象   得出结论,这是因为简单的物品缺乏一个奇特的名字。所以   我们给了他们一个,而且非常好。

     

http://www.martinfowler.com/bliki/POJO.html

答案 3 :(得分:6)

POJO:如果可以使用底层JDK执行该类,而没有任何其他外部第三方库支持那么它的名为POJO

JavaBean:如果类只包含带有访问器(setter和getter)的属性,则称为javabeans.Java bean通常不包含任何商业逻辑,而是用于在其中保存一些数据。

所有Javabeans都是POJO,但所有POJO都不是Javabeans

答案 4 :(得分:6)

Pojo - 普通的旧java对象

pojo类是一个普通的类,没有任何专业,类完全松散地耦合了技术/框架。该类不是从技术/框架实现的,也不是从技术/框架api扩展,类被称为pojo类。

pojo类可以实现接口和扩展类,但超类或接口不应该是技术/框架。

示例:

1

class ABC{
----
}

ABC类没有实现或扩展技术/框架,这就是为什么这是pojo类。

2

class ABC extends HttpServlet{
---
}

从servlet技术api扩展的ABC类,这就是为什么这不是pojo类。

3

class ABC implements java.rmi.Remote{
----
}

ABC类从rmi api实现,这就是为什么这不是pojo类。

4

class ABC implements java.io.Serializable{
---
}

这个接口是java语言的一部分,不是技术/框架的一部分。所以这是pojo类。

5

class ABC extends Thread{
--
}

这里的线程也是java语言的类,所以这也是一个pojo类。

6

class ABC extends Test{
--
}

如果Test类从技术/框架扩展或实现,那么ABC也不是pojo类,因为它继承了Test类的属性。 如果Test类不是pojo类,那么ABC类也不是pojo类。

7

现在这一点是一个例外情况

@Entity
class ABC{
--
}

@Entity是hibernate api或jpa api给出的注释,但我们仍然可以将此类称为pojo类。 具有从技术/框架给出的注释的类被这种特殊情况称为pojo类。

答案 5 :(得分:1)

POJOS具有某些约定(getter / setter,public no-arg构造函数,私有变量)并且正在运行(例如,用于按表单读取数据)是JAVABEANS

答案 6 :(得分:1)

  

Java Bean是POJO的特殊类型。

以下列出原因的特色菜

enter image description here

答案 7 :(得分:0)

您已经看到了上面的正式定义,因为它们都是值得的。

但是不要太迷恋定义。 我们再来看一下 感觉

JavaBeans用于企业Java应用程序,其中用户经常通过网络从服务器(通过Web或专用网络)远程访问数据和/或应用程序代码。因此,必须以串行格式将涉及的数据流传输到用户的计算机中或从用户的计算机中流出,因此需要Java EE对象来实现接口Serializable。 JavaBean的这一本质与从文件系统读取或写入数据的Java SE应用程序对象没有什么不同。 通过一系列用户机器/ OS组合在网络上可靠地使用Java类还要求采用约定进行处理。因此,需要将这些类实现为具有私有属性的公共类,无参数构造函数以及标准化的getter和setter。

Java EE应用程序还将使用除那些作为JavaBeans实现的类之外的其他类。这些可用于处理输入数据或组织输出数据,但不会用于通过网络传输的对象。因此,不需要将以上考虑应用于它们,除非它们可以作为Java对象有效。后面这些类称为POJO-普通的旧Java对象。

总而言之,您可以将Java Bean视为仅适用于网络使用的Java对象。

自1995年以来,在软件界有很多炒作-很少有骗子。

答案 8 :(得分:0)

总结:异同是:

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

所有JAVA Bean都是POJO,但并非所有POJO都是JAVA Bean。