原文出處:
http://hi.baidu.com/29163077/item/f543352bfddfdcfa50fd87b9
POJO 和JavaBean是我們常見的兩個關鍵字,一般容易混淆,POJO全稱是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻譯成:普通Java類,具有一部分getter/setter方法的那種類就可以稱作POJO,但是JavaBean則比 POJO復雜很多, Java Bean 是可復用的組件,對 Java Bean 並沒有嚴格的規范,理論上講,任何一個 Java 類都可以是一個 Bean 。但通常情況下,由於 Java Bean 是被容器所創建(如 Tomcat) 的,所以 Java Bean 應具有一個無參的構造器,另外,通常 Java Bean 還要實現 Serializable 接口用於實現 Bean 的持久性。 Java Bean 是不能被跨進程訪問的
JavaBean是一種組件技術,就好像你做了一個扳子,而這個扳子會在很多地方被拿去用,這個扳子也提供多種功能(你可以拿這個扳子扳、錘、撬等等),而這個扳子就是一個組件。
一般在web應用程序中建立一個數據庫的映射對象時,我們只能稱它為POJO。
POJO(Plain Old Java Object)這個名字用來強調它是一個普通java對象,而不是一個特殊的對象。2005年11月時,“POJO”主要用來指代那些沒用遵從特定的Java對象模型,約定或框架如EJB的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風格的軟件產品或框架事實上仍然要求使用預定的標注,譬如用於更方便的持久化。 JavaBean 是一種JAVA語言寫成的可重用組件。它的方法命名,構造及行為必須符合特定的約定:
- 這個類必須有一個公共的缺省構造函數。
- 這個類的屬性使用getter和setter來訪問,其他方法遵從標准命名規范。
- 這個類應是可序列化的。
因為這些要求主要是靠約定而不是靠實現接口,所以許多開發者把JavaBean看作遵從特定命名約定的POJO。 簡而言之,當一個Pojo可序列化,有一個無參的構造函數,使用getter和setter方法來訪問屬性時,他就是一個JavaBean。
我的整理與總結: 一、對於java bean,就是一個java模型組件,他為使用java類提供了一種標准的格式,在用戶程序和可視化管理工具中可以自動獲得這種具有標准格式的類的信息,並能夠創建和管理這些類。 java bean 可以使應用程序更加面向對象,可以把數據封裝起來,把應用的業務邏輯和顯示邏輯分離開,降低了開發的復雜程度和維護成本! JavaBean 是一種JAVA語言寫成的可重用組件。為寫成JavaBean,類必須是具體的和公共的,並且具有無參數的構造器。JavaBeans 通過提供符合一致性設計模式的公共方法將內部域暴露稱為屬性。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過自省機制發現和操作這些JavaBean 屬性。
從編程的角度,也就是最基本的實現了get跟set方法的類。
二、Enterprise Bean,也就是Enterprise JavaBean(EJB),是J2EE的一部分,定義了一個用於開發基於組件的企業多重應用程序的標准。其特點包括網絡服務支持和核心開發工具(SDK)。 在 J2EE里,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心代碼,分別是會話 Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。 1.Session Bean用於實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問數據庫,但更多時候,它會通過Entity Bean實現數據訪問。 這個類一般用單例模式來實現,因為每次連接都需要用到它。 2.Entity Bean是域模型對象, 用於實現O/R映射,負責將數據庫中的表記錄映射為內存中的Entity對象,事實上,創建一個Entity Bean對象相當於新建一條記錄,刪除一個 Entity Bean會同時從數據庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和數據庫同步。 Java Persistence 1.0規范中的entity bean僅作為普通Java對象(POJO)來使用,並且是映射到關系數據庫表的。與其他類型的EJB不同,entity bean可以被分配,序列化,並像任何其他POJO那樣通過網絡被發送出去。 3.MessageDriven Bean是EJB2.0中引入的新的企業Bean,它基於JMS消息,只能接收客戶端發送的JMS消息然后處理。MDB實際上是一個異步的無狀態Session Bean,客戶端調用MDB后無需等待,立刻返回,MDB將異步處理客戶請求。這適合於需要異步處理請求的場合,比如訂單處理,這樣就能避免客戶端長時間的等待一個方法調用直到返回結果。 三、Enterprise Bean 與 JavaBean的區別 最 初,JavaBean的目的是為了將可以重復使用的軟件代碼打包標准。特別是用與幫助廠家開發在綜合開發環境(IDE)下使用的java軟件部件。這些包 括如Grid控件,用戶可以將該部件拖放到開發環境中。從此,JavaBean就可以擴展為一個java web 應用的標准部件,並且JavaBean部件框架已經擴展為企業版的 Bean(EJB)。 JavaBean 和 Server Bean(通常稱為 Enterprise JavaBean (EJB))有一些基本相同之處。它們都是用一組特性創建,以執行其特定任務的對象或組件。它們還有從當前所駐留服務器上的容器獲得其它特性的能力。這使 得 bean 的行為根據特定任務和所在環境的不同而有所不同。 JavaBean 是使用 java.beans 包開發的,它是 Java 2 標准版的一部分。JavaBean 是一台機器上同一個地址空間中運行的組件。JavaBean 是進程內組件。Enterprise Bean 是使用 javax.ejb 包開發的,它是標准 JDK 的擴展,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多台機器上跨幾個地址空間運行的組件。因此 Enterprise Bean 是進程間組件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 則用作分布式商業對象. 四、POJO一個正規的Java對象(不是JavaBean,EntityBean等),也不擔當任何的特殊的角色,也不實現任何Java框架指定的接口。POJO是一個簡單的、正規Java對象,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不繼承或不實現任何其它Java框架的類或接口。 POJO 應該不是我們開始認為的JavaBean,當然更不是EJB,它不應該依賴於框架即繼承或實現某些框架類或接口。例如:Struts1中的Action和 ActionForm當然不屬於POJO了,而在Struts2中的Action由於可以不繼承任何的接口,所以在這種情況下Action是POJO,但 是Struts2中的Action也可以繼承ActionSupport類就不再屬於POJO了。POJO里面是可以包含業務邏輯處理和持久化邏輯,也可 以包含類似與JavaBean屬性和對屬性訪問的set和get方法的。 在百度百科上的解釋是:簡 單的Java對象(Plain Ordinary Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來, 而且簡稱比較直接. 其中有一些屬性及其getter setter方法的類,有時可以作為value object或dto(Data Transform Object)來使用.當然,如果你有一個簡單的運算屬性也是可以的,但不允許有業務方法,也不能攜帶有connection之類的方法。
POJO是Plain Ordinary Java Objects的縮寫不錯,但是它通指沒有使用Entity Beans的普通java對象,可以把POJO作為支持業務邏輯的協助類。 而我的理解是:POJO 跟Entity Bean的區別僅在於Entity Bean必須要映射到數據庫里,而POJO僅用於業務邏輯,當然也可以映射到數據庫中,也就是Entity Bean是POJO的特例,當然它們是不同的標准中的,個人認為Entity Bean是基於POJO的,不知道對不對?