2009-09-08 70 views
156

我不確定差異。我使用Hibernate,並且在某些書中,他們使用JavaBean和POJO作爲可互換的術語。我想知道是否有區別,不僅僅是在Hibernate上下文中,而是作爲一般概念。JavaBean和POJO有什麼區別?

回答

204

JavaBean遵循某些約定。 Getter/setter命名,具有公共默認構造函數,可串行化等。有關更多詳細信息,請參閱JavaBeans Conventions

POJO(普通舊Java對象)沒有嚴格定義。它是一個Java對象,它不需要實現特定的接口或從特定的基類派生,或者使用特定的註釋來與給定的框架兼容,並且可以是任意的(通常相對簡單的) Java對象。

+32

請注意,JavaBean可以並且通常是POJO,許多POJO實際上是JavaBean。 – 2009-09-08 14:21:17

+8

不,根據POJO的定義,Java Bean不是* POJO,因爲被認爲是Java Bean,所以類必須遵循特定的編碼約定(例如,有一個沒有參數的構造函數,以「get」和/或「set」開頭的方法)或者與BeanInfo類一起分發。 – Nat 2009-09-08 14:36:11

+14

因爲這些都是*約定*,所以我認爲你可以成功地爭論一個bean可以是一個POJO(例如,你不是從JavaBean接口或類似的東西繼承) – 2009-09-08 14:46:14

70

所有的JavaBeans都是POJO,但並非所有的POJO都是JavaBean。

一個JavaBean是一個Java對象滿足某些編程約定:

  • 的JavaBean類必須實現串行化或外部化;
  • JavaBean類必須具有公共的無參數構造函數;
  • 所有的JavaBean屬性都必須具有public setter和getter方法(如適用);
  • 所有JavaBean實例變量都應該是私有的。
+1

我以爲POJO不能實現'Serializable'。 – naXa 2015-03-20 12:27:11

+6

「JavaBean類必須有一個無參數構造函數;」還要添加** public ** – radistao 2016-10-27 08:43:39

+0

JavaBean是可序列化的,這就是爲什麼JavaBean不是POJO的原因。 – karlihnos 2017-06-23 07:05:16

15

根據Martin Fowler的一個POJO是一個對象,它封裝了業務邏輯,而一個Bean(除其他答案已經指出的定義)比一個容器而已保存數據和操作的對象上提供僅僅設置並獲取數據。

術語被創造出來,而麗貝卡帕森斯,約什 - 麥肯齊和我 在2000年9月準備在大會上發言。在我們 被指出編碼的業務邏輯的諸多好處會談到 常規的Java對象而不是使用Entity Beans。我們想知道爲什麼 人們反對在他們的系統中使用常規對象,並且 得出結論,這是因爲簡單的對象缺乏一個奇特的名字。所以 我們給了他們一個,它很好地被抓住了。

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

0

POJOS與某些慣例(的getter/setter,公共無參數構造,私有變量),並且在動作(例如被用於通過讀取形式數據)是JAVABEANS

3

POJO:如果類可以與底層JDK來執行,而沒有任何其它外部第三方庫支持那麼其稱爲POJO

的JavaBean:如果類僅包含具有訪問器(setter和getter)的屬性的那些被稱爲JavaBeans的.Java beans通常不會包含任何商業邏輯,而是用於保存一些數據。

所有JavaBeans是POJO,但所有POJO都沒有的Javabean

0

POJO的 - 簡單Java對象

POJO類是沒有任何特色的普通類,類完全鬆散從技術/ framework.the再加類不是從技術/框架實現的,也不是從類被稱爲pojo類的技術/框架api擴展而來。

pojo類可以實現接口和擴展類,但超類或接口不應該是技術/框架。

例子:

1.

class ABC{ 
---- 
} 

ABC類不執行或技術/框架,這就是爲什麼這是POJO類擴展。

2.

class ABC extends HttpServlet{ 
--- 
} 

從servlet技術的API,這就是爲什麼這不是一個POJO類擴展ABC類。

3.

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

ABC類從RMI API,這就是爲什麼這不是一個POJO類實現。

4.

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

這個接口是Java語言的一部分,而不是技術的一部分/ framework.so這是POJO類。

5.

class ABC extends Thread{ 
-- 
} 

這裏線程也是類Java語言的,所以這是也是一個POJO類。

6.

class ABC extends Test{ 
-- 
} 

如果測試類擴展或從技術/框架實現然後ABC也不是一個POJO類,因爲它繼承測試類的屬性。 如果Test類不是pojo類,那麼ABC類也不是pojo類。

現在這個點是一個例外情況

@Entity 
class ABC{ 
-- 
} 

@Entity是Hibernate API或者JPA API給出的註解,但是我們仍然可以調用這個類是POJO類。 由技術/框架給出的註釋類被這種特殊情況稱爲pojo類。