Java - POJO 与 JavaBean 的区别

POJO 和JavaBean是我们常见的两个关键字,一般容易混淆。

POJO

全称是Plain Ordinary Java Object / Pure Old Java Object,普通的Java对象。

POJO是旧的JavaBean意思,那么什么是新的JavaBean,就是EJB,因为EJB2.0以前规范对JavaBean要求很多,搞得很复杂,这样大家怀念起旧的Javabean了,当时Spring推出正好符合这种要求。

现在EJB3以后,都是POJO了。

JavaBean –>POJO —> EJB 2 —> Spring —->EJB3/Spring

这是大概一个历史路径,POJO的特点是不继承或实现任何非业务类或接口,这样,我们开发的业务POJO就不依赖任何框架,而以前EJB2的Enterprise JavaBean是指定JavaBean需要继承实现EJBHome等用于分布式的接口。

POJO后来延伸为一种非侵入性代名词,也就是说:选择技术框架或开发框架,不能让别人基于你框架开发的JavaBean依赖你的框架,要实现这种目的,需要通过DI依赖注入 AOP等等技术才能实现。

POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

理想地讲,一个POJO是一个不受任何限制的Java对象(除了Java语言规范)。

例如一个POJO应该是:

  • 扩展预定的类,如 public class Foo extends javax.servlet.http.HttpServlet { …
  • 实现预定的接口,如 public class Bar implements javax.ejb.EntityBean { …
  • 包含预定的标注,如 @javax.ejb.Entity public class Baz{ …
    然而,因为技术上的困难及其他原因,许多兼容POJO风格的软件产品或框架事实上仍然要求使用预定的标注,譬如用于更方便的持久化。

使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接。其中有一些属性及其getter、setter方法的类,没有业务逻辑,有时可以作为VO(value-object)或dto(Data Transform Object)来使用。当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法。

POJO对象有时也被称为Data对象,大量应用于表现现实中的对象。如果项目中使用了Hibernate框架,有一个关联的xml文件,使对象与数据库中的表对应,对象的属性与表中的字段相对应。

POJO的格式用于数据的临时传递,它只能装在数据,作为数据存储的载体,而不具有业务逻辑处理的能力。

POJO类的作用是方便程序员使用数据库中的数据表,对于程序员来说,可以很方便的将POJO类当作对象来进行使用,也可以方便的调用其get,set方法。但不允许有业务方法,也不能携带有connection之类的方法,即不包含业务逻辑或持久逻辑等。

JavaBean

Sun公司的定义,JavaBean是一个可重复使用的软件组件。实际上 JavaBean 是一种Java类,通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。

JavaBean 是一种JAVA语言写成的可重用组件。它的方法命名,构造及行为必须符合特定的约定:

  • 这个类必须有一个公共的缺省构造函数。
  • 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
  • 这个类应是可序列化的。
  • 因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。

JavaBean的任务就是: “Write once, run anywhere, reuse everywhere”,即“一次性编写,任何地方执行,任何地方重用”。

JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。

简而言之,POJO 其实是比 JavaBean 更纯净的简单类或接口。
POJO 严格地遵守简单对象的概念,而一些 JavaBean 中往往会封装一些简单逻辑。
当一个 POJO 可序列化,有一个无参的构造函数,使用 getter 和 setter 方法来访问属性时,他就是一个 JavaBean。
JavaBean 虽然数据的获取与 POJO 一样,但是 JavaBean 当中可以有其它的方法。

错误的认识

POJO是这样的一种“纯粹的”JavaBean,在它里面除了JavaBean规范的方法和属性没有别的东西,即private属性以及对这个属性方法的public的get和set方法。我们会发现这样的JavaBean很“单纯”,它只能装载数据,作为数据存储的载体,而不具有业务逻辑处理的能力。

真正的意思

POJO = “Plain Old Java Object”,
是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不担当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB,JDBC等等。
即POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。

下面是摘自Martin Fowler个人网站的一句话:
“We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it’s caught on very nicely.”--Martin Fowler

我们疑惑为什么人们不喜欢在他们的系统中使用普通的对象,我们得到的结论是——普通的对象缺少一个响亮的名字,因此我们给它们起了一个,并且取得了很好的效果。——Martin Fowler

参考:
https://baike.baidu.com/item/POJO/3311958
https://blog.csdn.net/tiantangdizhibuxiang/article/details/81784873