JavaBean和POJO有什么区别?


210

我不确定有什么区别。我正在使用Hibernate,在某些书中,它们使用JavaBean和POJO作为可互换术语。我想知道是否有区别,不仅在Hibernate上下文中,而且在一般概念上。

Answers:


252

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

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


41
注意,JavaBean可以是并且通常是POJO,而许多POJO实际上是JavaBean。
约阿希姆·绍尔

8
不,根据POJO的定义,Java Bean 不是 POJO,因为要被视为Java Bean,类必须遵循某些编码约定(例如,具有no-arg构造函数,具有以“ get”开头的方法和/或“ set”)或与BeanInfo类一起分发。
Nat

15
由于这些是约定,我认为您可以成功地辩称bean可以是POJO(例如,您不是从JavaBean接口或类似对象继承)
Brian Agnew

1
JavaBeans规范除了非常松散地将JavaBean定义为“可重用软件组件”(或某些此类组件)之外,未能定义JavaBean。它不必具有无参数的构造函数,不需要以“ get”或“ set”开头的方法,不需要是可序列化的,甚至不需要是一个类。
Tom Hawtin-大头钉

4
用数学术语来说,我们可以说Javabeans是POJO的子集,因为对POJO的特定约束使其成为Javabean。
Nishit

106

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

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

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

1
我以为POJO无法实现Serializable
naXa

10
“ JavaBean类必须具有无参数构造函数;” 也可以在此处添加公众信息
radistao '16

JavaBean是可序列化的,这就是为什么JavaBean不是POJO的原因。
karlihnos

25

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

这个词是在Rebecca Parsons,Josh MacKenzie和我在2000年9月的一次会议上准备演讲时创造的。在演讲中,我们指出了将业务逻辑编码为常规Java对象而不是使用Entity Beans的许多好处。我们想知道为什么人们反对在他们的系统中使用常规对象,并得出结论,这是因为简单的对象缺少花哨的名称。因此,我们给了他们一个,非常受欢迎。

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


7

POJO:如果可以使用基础JDK执行该类,而没有任何其他外部第三方库支持,则称为POJO

JavaBean:如果类仅包含具有访问器(设置器和获取器)的属性,则这些属性称为javabeans.Java bean通常将不包含任何业务逻辑,而是用于在其中保存一些数据的逻辑。

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


7

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语言的一部分,而不是technology / framework.so的一部分。所以这是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类。



1

POJOS具有某些约定(getter / setter,public no-arg构造函数,私有变量)并且正在起作用(例如,用于通过表格读取数据)JAVABEANS


1

总结:异同是:

   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。


0

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

但是不要太迷恋定义。让我们只看一下这里的事物感觉

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

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

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

自1995年以来,在软件世界中出现了很多炒作,而且数量很少。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.