JavaBean和POJO有什么区别?

DJp*_*ath 203 java terminology pojo

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

Bri*_*new 245

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

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

  • 请注意,JavaBean可以且通常是POJO,而许多POJO实际上是JavaBean. (40认同)
  • 因为这些是*约定*,我认为您可以成功地争辩说bean可以是POJO(例如,您不是从JavaBean接口或类似接口继承) (15认同)
  • 不,通过POJO的定义,Java Bean不是*POJO,因为要被视为Java Bean,类必须遵循某些编码约定(例如,有一个无参数的构造函数,请使用以"get"开头的方法, /或"set")或与BeanInfo类一起分发. (8认同)
  • 在数学术语中,我们可以说Javabeans构成了POJO的一个子集,因为对POJO施加的特定约束使它成为Javabean. (4认同)
  • JavaBeans 规范除了非常松散地将 JavaBean 定义为“可重用的软件组件”(或某些类似的组件)之外,未能将其定义为 JavaBean。它不必具有无参数构造函数,不需要以“get”或“set”开头的方法,不需要可序列化,甚至不需要是一个类。 (2认同)

小智 102

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

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

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

  • "JavaBean类必须有一个无参数的构造函数;" 还要在这里添加**public** (9认同)
  • 我认为 POJO 不能实现`Serializable`。 (2认同)

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

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


Man*_*ill 7

Pojo - 普通的旧java对象

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

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

例子 :

1.

class ABC{
----
}
Run Code Online (Sandbox Code Playgroud)

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

2.

class ABC extends HttpServlet{
---
}
Run Code Online (Sandbox Code Playgroud)

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

3.

class ABC implements java.rmi.Remote{
----
}
Run Code Online (Sandbox Code Playgroud)

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

4.

class ABC implements java.io.Serializable{
---
}
Run Code Online (Sandbox Code Playgroud)

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

5.

class ABC extends Thread{
--
}
Run Code Online (Sandbox Code Playgroud)

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

6.

class ABC extends Test{
--
}
Run Code Online (Sandbox Code Playgroud)

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

7.

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

@Entity
class ABC{
--
}
Run Code Online (Sandbox Code Playgroud)

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