1. 程式人生 > >沉澱再出發:Bean,JavaBean,POJO,VO,PO,EJB等名詞的異同

沉澱再出發:Bean,JavaBean,POJO,VO,PO,EJB等名詞的異同

沉澱再出發:Bean,JavaBean,POJO,VO,PO,EJB等名詞的異同

一、前言

  想必大家都有這樣的困惑,接觸的東西越多卻越來越混亂了,這個時候就要進行對比和深入的探討了,抓住每一個概念背後的核心,才能徹底的解決問題,形成自己的理念和道理。

二、Bean,JavaBean,POJO,VO,PO,EJB等名詞的比較

  2.1、Bean

    Bean的中文含義是“豆子”,Bean的含義是可重複使用的Java元件。所謂元件就是一個由可以自行進行內部管理的一個或幾個類所組成、外界不瞭解其內部資訊和執行方式的群體。使用它的物件只能通過介面來操作。Bean並不需要繼承特別的基類(BaseClass)或實現特定的介面(Interface)。Bean的編寫規範使Bean的容器(Container)能夠分析一個Java類檔案,並將其方法(Methods)翻譯成屬性(Properties),即把Java類作為一個Bean類使用。Bean的編寫規範包括Bean類的構造方法、定義屬性和訪問方法編寫規則。

  2.2、javaBean

    JavaBean 是一種JAVA語言寫成的可重用元件。為寫成JavaBean,類必須是具體的和公共的,並且具有無引數的構造器。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性,set和get方法獲取。眾所周知,屬性名稱符合這種模式,其他Java 類可以通過自省機制(反射機制)發現和操作這些JavaBean 的屬性。使用者可以使用JavaBean將功能、處理、值、資料庫訪問和其他任何可以用java程式碼創造的物件進行打包,並且其他的開發者可以通過內部的JSP頁面、Servlet、其他JavaBean、applet程式或者應用來使用這些物件。使用者可以認為JavaBean提供了一種隨時隨地的複製和貼上的功能,而不用關心任何改變。JavaBean可分為兩種:一種是有使用者介面(UI,User Interface)的JavaBean;還有一種是沒有使用者介面,主要負責處理事務(如資料運算,操縱資料庫)的JavaBean。JSP通常訪問的是後一種JavaBean。 Java Bean 是不能被跨程序訪問的。JavaBean實際上是指一種特殊的Java類,它通常用來實現一些比較常用的簡單功能,並可以很容易的被重用或者是插入其他應用程式中去。所有遵循“一定程式設計原則”的Java類都可以被稱作JavaBean。
     JavaBean在Java EE開發中,通常用於封裝資料,對於遵循以上寫法的JavaBean元件,其它程式可以通過反射技術例項化JavaBean物件(內省機制),並且通過反射那些遵循命名規範的方法,從而獲知JavaBean的屬性,進而呼叫其屬性儲存資料。因為這些要求主要是靠約定而不是靠實現介面,所以許多開發者把JavaBean看作遵從特定命名約定的POJO。(可以這麼理解,POJO按JavaBean的規則來,就可以變成JavaBean)。簡而言之,當一個POJO可序列化(本質上是不可以序列化的),有一個無參的建構函式,使用getter和setter方法來訪問屬性時,就是一個JavaBean。


     對於JavaBean,就是一個Java模型元件,為使用Java類提供了一種標準的格式,在使用者程式和視覺化管理工具中可以自動獲得這種具有標準格式的類的資訊,並能夠建立和管理這些類。 JavaBean可以使應用程式更加面向物件,可以把資料封裝起來,把應用的業務邏輯和顯示邏輯分離開,降低了開發的複雜程度和維護成本;JavaBean 是一種JAVA語言寫成的可重用元件。Java Bean 是不能被跨程序訪問的。JavaBean 是使用 java.beans 包開發的,它是 Java 2 標準版的一部分。JavaBean 是一臺機器上同一個地址空間中執行的元件。JavaBean 是程序內元件。JavaBean符合一定規範編寫的Java類,不是一種技術,而是一種規範。大家針對這種規範,總結了很多開發技巧、工具函式。符合這種規範的類,可以被其它的程式設計師或者框架使用。它的方法命名,構造及行為必須符合特定的約定:

1 所有屬性為private。
2 這個類必須有一個公共的預設建構函式。即是提供無引數的構造器。
3 這個類的屬性使用getter和setter來訪問,其他方法遵從標準命名規範。
4 這個類應是可序列化的。實現serializable介面。

 2.3、POJO

    POJO(Plain Old Java Object)按照Martin Fowler的解釋是“Plain Old Java Object”,從字面上翻譯為“純潔老式的Java物件”,但大家都使用“簡單java物件”來稱呼它。POJO的內在含義是指:那些沒有繼承任何類、也沒有實現任何介面,更沒有被其它框架侵入的java物件。
    POJO是一個簡單的、普通Java物件,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不繼承或不實現任何其它Java框架的類或介面。 可以包含類似與JavaBean屬性和對屬性訪問的setter和getter方法的。POJO(Plain Old Java Object)這個名字用來強調它是一個普通java物件,而不是一個特殊的物件。“POJO”主要用來指代那些沒用遵從特定的Java物件模型,約定或框架如EJB的Java物件。理想地講,一個POJO是一個不受任何限制的Java物件(除了Java語言規範)。例如一個POJO不應該是

   1. 擴充套件預定的類,如public class Foo extends javax.servlet.http.HttpServlet { ...
   2. 實現預定的介面,如public class Bar implements javax.ejb.EntityBean { ...
   3. 包含預定的標註,如@javax.ejb.Entity public class Baz{ ...

    一般在web應用程式中建立一個數據庫的對映物件時,我們只能稱它為POJO。將業務邏輯寫進規則的Java物件(regular java objects)中,比使用Entity Beans更有好處。另外給具有業務邏輯處理的規則的Java物件(regular java objects)起了一個名字——POJO,這些Java物件不是EntityBeans。基本意思是說POJO一個普通的Java物件(不是JavaBean,EntityBean等),也不擔當任何的特殊的角色,也不實現任何Java框架指定的介面。POJO裡面是可以包含業務邏輯處理和持久化邏輯,也可以包含類似與JavaBean屬性和對屬性訪問的set和get方法的。POJO是一個簡單的、普通Java物件,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具有任何特殊角色,不繼承或不實現任何其它Java框架的類或介面。

   大家可以看官方解釋,在很多地方都是錯誤的,說POJO不能包含業務邏輯:


     POJO可以認為是一箇中間物件:

     一箇中間物件,可以轉化為PO、DTO、VO。
1 .POJO持久化之後==〉PO
2 .POJO傳輸過程中==〉DTO
3 .POJO用作表示層==〉VO

 2.4、VO

     VO :value object 值物件 / view object 表現層(檢視)物件。
    通常用於業務層之間的資料傳遞,和PO一樣也是僅僅包含資料而已。但應是抽象出的業務物件,可以和表對應,也可以不,這根據業務的需要。個人覺得同DTO(資料傳輸物件),在web上傳遞。VO(value object)是值物件,精確點講它是業務物件,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為資料提供一個生存的地方。VO的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的資料的名稱。VO準確地講,是業務物件,是業務邏輯需要了解,需要使用的,再簡單地講,它是概念模型轉換得到的。
    首先說PO和VO吧,它們的關係應該是相互獨立的,一個VO可以只是PO的部分,也可以是多個PO構成,同樣也可以等同於一個PO。正因為這樣,PO獨立出來,資料持久層也就獨立出來了,它不會受到任何業務的干涉。又正因為這樣,業務邏輯層也獨立開來,它不會受到資料持久層的影響,業務層關心的只是業務邏輯的處理,至於怎麼存怎麼讀交給別人吧!不過,另外一點,如果我們沒有使用資料持久層,或者說沒有使用hibernate,那麼PO和VO也可以是同一個東西,雖然這並不好。
   VO(view object)表現層物件,檢視物件。用一個VO物件對應整個介面的值。主要對應頁面顯示(web頁面/swt、swing介面)的資料物件。可以和表對應,也可以不,這根據業務的需要。

 2.5、PO

    persistent object持久物件。O/R Mapping 是 Object Relational Mapping(物件關係對映)的縮寫。通俗點講,就是將物件與關係資料庫繫結,用物件來表示關係資料。PO是在O/R對映的時候出現的概念,如果沒有O/R對映,沒有這個概念存在了。常用的O/R對映框架有hibernate等。通常對應資料模型(資料庫),本身還有部分業務邏輯的處理。可以看成是與資料庫中的表相對映的java物件。最簡單的PO就是對應資料庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對資料庫的操作。

1、有時也被稱為Data物件,對應資料庫中的entity,可以簡單認為一個PO對應資料庫中的一條記錄。
2、在hibernate持久化框架中與insert/delet操作密切相關。
3、PO中不應該包含任何對資料庫的操作。
4、PO的屬性是跟資料庫表的欄位一一對應的。
5、PO物件需要實現序列化介面。

     就是說在一些Object/Relation Mapping工具中,能夠做到維護資料庫表記錄的persisent object完全是一個符合Java Bean規範的純Java物件,沒有增加別的屬性和方法。

 2.6、EJB

     Enterprise Bean,也就是Enterprise JavaBean(EJB),是J2EE的一部分,定義了一個用於開發基於元件的企業多重應用程式的標準。其特點包括網路服務支援和核心開發工具(SDK)。在 J2EE裡,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心程式碼,分別是會話 Bean(Session Bean),實體Bean(Entity Bean)和訊息驅動Bean(MessageDriven Bean)
     Session Bean用於實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問資料庫,但更多時候,它會通過Entity Bean實現資料訪問。 這個類一般用單例模式來實現,因為每次連線都需要用到它。Entity Bean是域模型物件,用於實現O/R對映,負責將資料庫中的表記錄對映為記憶體中的Entity物件,事實上,建立一個Entity Bean物件相當於新建一條記錄,刪除一個 Entity Bean會同時從資料庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和資料庫同步。 Enterprise Bean 是使用 javax.ejb 包開發的,它是標準 JDK 的擴充套件,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多臺機器上跨幾個地址空間執行的元件。因此 Enterprise Bean 是程序間元件
     我們一般所熟悉的tomcat僅僅只實現了j2ee的一小部分規範,它只是一個serlvet的容器(Web)容器,它不能跑J2EE的程式,EJB說到底也是種規範,它是j2EE下面的一個子分類(核心類),所以j2ee包含EJB,同時我們都可以說JBOSS,Weblogic,WebSphere是J2EE容器,也可以叫EJB容器。因為它們能跑EJB元件。那麼什麼是EJB元件呢?其實就是java寫出來的一段程式被打包成EAR包,這個EAR包放在某個EJB的容器的特定目錄下啟動就可以跑了。類似於網際網路公司經常使用的WAR包(部署在tomcat上)。EJB是一種是很老、很繁瑣的技術標準(規範),現如今基本已經被淘汰了。因為EJB的繁瑣、難用,spring的出現徹底革了EJB的命,不然怎麼說是Java的春天(spring)來了呢。EJB實現原理: 就是把原來放到客戶端實現的程式碼放到伺服器端,並依靠RMI進行通訊。

 

  2.7、DAO

    data access object 資料訪問物件。主要用來封裝對資料庫的訪問。通過它可以把POJO持久化為PO,用PO組裝出來VO、DTO。是一個sun的一個標準j2ee設計模式,這個模式中有個介面就是DAO,它負持久層的操作。為業務層提供介面。此物件用於訪問資料庫。通常和PO結合使用,DAO中包含了各種資料庫的操作方法。通過它的方法,結合PO對資料庫進行相關的操作。夾在業務邏輯與資料庫資源中間。配合VO,提供資料庫的CRUD操作。主要用來封裝對DB(資料庫)的訪問(CRUD操作)。通過接收業務層的資料,把POJO持久化為PO。

 2.8、DTO (TO)     

     Data Transfer Object 資料傳輸物件。主要用於遠端呼叫等需要大量傳輸物件的地方。可以將PO中的部分屬性抽取出來,就形成了DTO。比如我們一張表有100個欄位,那麼對應的PO就有100個屬性。但是我們介面上只要顯示10個欄位,客戶端用WEB service來獲取資料,沒有必要把整個PO物件傳遞到客戶端,這時我們就可以用只有這10個屬性的DTO來傳遞結果到客戶端,這樣也不會暴露服務端表結構.到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO(View Object)。用在需要跨程序或遠端傳輸時,它不應該包含業務邏輯。比如一張表有100個欄位,那麼對應的PO就有100個屬性(大多數情況下,DTO 內的資料來自多個表)。但view層只需顯示10個欄位,沒有必要把整個PO物件傳遞到client,這時我們就可以用只有這10個屬性的DTO來傳輸資料到client,這樣也不會暴露server端表結構。到達客戶端以後,如果用這個物件來對應介面顯示,那此時它的身份就轉為VO(View Object)。

 2.9、BO

     business object 業務物件。主要作用是把業務邏輯封裝為一個物件。這個物件可以包括一個或多個其它的物件。比如一個簡歷,有教育經歷、工作經歷、社會關係等等。我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會關係對應一個PO。建立一個對應簡歷的BO物件處理簡歷,每個BO包含這些PO。這樣處理業務邏輯時,我們就可以針對BO去處理。封裝業務邏輯的java物件,通過呼叫DAO方法,結合PO,VO進行業務操作。封裝業務邏輯為一個物件(可以包括多個PO,通常需要將BO轉化成PO,才能進行資料的持久化,反之,從資料庫中得到的PO,需要轉化成BO才能在業務層使用)。關於BO主要有三種概念:只包含業務物件的屬性;只包含業務方法;兩者都包含。在實際使用中,認為哪一種概念正確並不重要,關鍵是實際應用中適合自己專案的需要。

參考文獻:https://blog.csdn.net/chenchunlin526/article/details/69939337