天天看點

DTO,VO,POJO,JavaBeans之間的差別?

看過類似的問題:

  • JavaBean和POJO有什麼差別?
  • POJO(普通的舊Java對象)和DTO(資料傳輸對象)之間有什麼差別?

您還可以告訴我使用它們的上下文嗎? 還是他們的目的?

#1樓

Java Bean與EJB不同。

Java 1.0中的JavaBeans規範是Sun嘗試允許在看起來像VB的IDE中操縱Java對象的方法。 對于合格為“ Java Bean”的對象,制定了一些規則:

  1. 預設構造函數
  2. 遵循正确命名約定的私有資料成員的擷取器和設定器
  3. 可序列化
  4. 也許其他人我忘記了。

EJB後來問世。 它們将分布式元件和事務模型結合在一起,并在管理線程,池化,生命周期和提供服務的容器中運作。 它們與Java Beans相去甚遠。

DTO是在Java上下文中出現的,因為人們發現EJB 1.0規範對資料庫太“閑談”了。 人們不必将每個資料元素都進行往返,而是将它們打包成Java Bean并運送到周圍。

POJO是對EJB的一種反應。

#2樓

DTO與VO

DTO-資料傳輸對象僅僅是用于在層和層之間傳輸資料的資料容器。

  • 它主要包含屬性。 您甚至可以使用沒有getter和setter的公共屬性。
  • 資料傳輸對象不包含任何業務邏輯。

比喻:

具有屬性使用者名,密碼和電子郵件ID的簡單系統資料庫單。

  • 當此表單在RegistrationServlet檔案中送出時,您将獲得從視圖層到業務層的所有屬性,然後在其中将屬性傳遞給Java Bean,然後傳遞給DAO或持久層。
  • DTO幫助将屬性從視圖層傳輸到業務層,最後到持久層。

DTO主要用于有效地跨網絡傳輸資料,甚至可能從JVM到另一個JVM。

DTO通常是

java.io.Serializable

為了跨JVM傳輸資料。

VO-值對象[1] [2]本身表示一組固定的資料,并且類似于Java枚舉。 值對象的身份基于其狀态而不是對象的身份,并且是不可變的。 真實的示例是Color.RED,Color.BLUE,SEX.FEMALE等。

POJO與JavaBeans

[1] POJO的Java-Beanness是,所有私有屬性都可以通過符合JavaBeans約定的公共getter和setter進行通路。 例如

private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 
           

[2] JavaBeans必須實作Serializable并且具有無參數構造函數,而在POJO中則沒有這些限制。

#3樓

JavaBeans

JavaBean是遵循Sun定義的JavaBeans約定的類。 Wikipedia很好地總結了什麼是JavaBean :

JavaBean是Java的可重用軟體元件,可以在建構器工具中直覺地對其進行操作。 實際上,它們是用Java程式設計語言編寫的,符合特定約定的類。 它們用于将許多對象封裝到單個對象(bean)中,以便可以将它們作為單個bean對象而不是多個單個對象傳遞。 JavaBean是可序列化的Java對象,具有一個null構造函數,并允許使用getter和setter方法通路屬性。

為了充當JavaBean類,對象類必須遵守有關方法命名,構造和行為的某些約定。 這些約定使擁有可以使用,重用,替換和連接配接JavaBean的工具成為可能。

所需的約定為:

  • 該類必須具有公共預設構造函數。 這樣可以在編輯和激活架構内輕松執行個體化。
  • 必須遵循标準命名約定,使用get,set和其他方法(所謂的accessor方法和mutator方法)通路類屬性。 這樣可以輕松自動地檢查和更新架構中的Bean狀态,其中許多架構都包含針對各種類型的屬性的自定義編輯器。
  • 該類應可序列化。 這允許應用程式和架構以獨立于VM和平台的方式可靠地儲存,存儲和還原Bean的狀态。
因為這些需求主要通過約定而不是通過實作接口來表達,是以某些開發人員将JavaBeans視為遵循特定命名約定的Plain Old Java Object。

POJO

普通的舊Java對象或POJO是最初引入的一個術語,用于指定一個簡單的輕量級Java對象,而不是實作任何

javax.ejb

接口,而不是重量級的EJB 2.x(特别是實體Bean,無狀态會話Bean并不是那麼糟糕的IMO)。 。 今天,該術語用于任何沒有多餘東西的簡單對象。 同樣,維基百科在定義POJO方面做得很好:

POJO是Plain Old Java Object的首字母縮寫。 該名稱用來強調所讨論的對象是普通的Java對象,而不是特殊的對象,尤其不是Enterprise JavaBean(特别是在EJB 3之前)。 這個詞是2000年9月由Martin Fowler,Rebecca Parsons和Josh MacKenzie創造的:
“我們想知道為什麼人們不反對在他們的系統中使用正常對象,并得出結論,這是因為簡單的對象缺少奇特的名稱。是以我們給了他們一個名稱,并且非常流行。”

對于未使用新功能的技術,例如電話中的POTS(普通舊電話服務)和C ++中定義但僅使用C語言功能的PODS(普通舊資料結構),該術語延續了較舊術語的模式。和Perl中的POD(普通舊文檔)。

該術語很可能已被廣泛接受,因為需要與複雜的對象架構形成對比的通用且易于了解的術語。 JavaBean是可序列化的POJO,具有無參數構造函數,并允許使用getter和setter方法通路屬性。 Enterprise JavaBean不是單個類,而是整個元件模型(同樣,EJB 3降低了Enterprise JavaBeans的複雜性)。

随着使用POJO的設計變得越來越普遍,出現了為POJO提供架構中使用的某些功能以及可以選擇哪些功能領域的更多選擇的系統。 Hibernate和Spring是示例。

價值對象

值對象或VO是諸如

java.lang.Integer

儲存值的對象(是以為值對象)。 對于更正式的定義,我經常參考Martin Fowler對Value Object的描述:

在《企業應用程式體系結構模式》中,我将值對象描述為一個小對象,例如貨币或日期範圍對象。 它們的關鍵特性是它們遵循值語義而不是引用語義。

您通常可以告訴他們,因為它們的相等性概念不是基于身份的,而是如果兩個值對象的所有字段都相等,則它們相等。 盡管所有字段都相等,但是如果子集是唯一的,則無需比較所有字段-例如,貨币對象的貨币代碼足以測試相等性。

一般的啟發式方法是價值對象應該完全不可變。 如果要更改值對象,則應使用新對象替換該對象,并且不允許更新該值對象本身的值-可更新的值對象會導緻混疊問題。

早期的J2EE文獻使用術語“值對象”來描述不同的概念,我稱之為資料傳輸對象 。 此後,他們改變了用法,改用術語“ 傳輸對象” 。

您可以在Wiki和Dirk Riehle的有價值的對象上找到更多的好材料。

資料傳輸對象

資料傳輸對象或DTO是EJB引入的(反)模式。 它不是在EJB上執行許多遠端調用,而是将資料封裝在可以通過網絡傳輸的值對象中:資料傳輸對象。 維基百科對資料傳輸對象有一個不錯的定義:

資料傳輸對象(DTO),以前稱為值對象或VO,是一種設計模式,用于在軟體應用程式子系統之間傳輸資料。 DTO通常與資料通路對象結合使用,以從資料庫中檢索資料。

資料傳輸對象與業務對象或資料通路對象之間的差別在于,DTO除了存儲和檢索自己的資料(通路者和變異者)外,沒有其他行為。

在傳統的EJB架構中,DTO具有雙重目的:首先,它們解決了實體bean無法序列化的問題; 其次,它們隐式定義一個組裝階段,在該階段中,将視圖使用的所有資料都提取并編組到DTO中,然後再将控制權傳回到表示層。

是以,對于許多人來說,DTO和VO是同一件事(但是Fowler使用VO表示我們所看到的其他含義)。 大多數時候,它們遵循JavaBeans約定,是以也是JavaBean。 而且都是POJO。

#4樓

基本上,

DTO:“資料傳輸對象”可以在軟體體系結構的不同層之間傳播。

VO:“值對象”包含一個對象,例如Integer,Money等。

POJO:普通的舊Java對象,不是特殊對象。

Java Bean:要求

Java Class

是可序列化的,具有

no-arg

構造函數以及每個字段的getter和setter

#5樓

POJO :這是一個Java檔案(類),不會擴充或實作任何其他Java檔案(類)。

Bean :這是一個Java檔案(類),其中所有變量都是私有的,方法是公共的,并且使用适當的getter和setter用于通路變量。

普通類 :它是一個Java檔案(類),可以由公共/私有/預設/受保護的變量組成,并且可以擴充也可以不擴充或實作另一個Java檔案(類)。

#6樓

先說說

普通類 -這意味着任何類在Java中都是正常的定義,這意味着您建立了不同類型的方法屬性等。

Bean- Bean沒什麼,它隻是該特定類的對象,使用此Bean可以通路與對象相同的Java類。 。

然後談論最後一個POJO

POJO - POJO是沒有任何服務的類,它隻有一個預設構造函數和private屬性,并且這些屬性用于設定與setter和getter方法相對應的值。 它是Plain Java Object的簡稱。

#7樓

  • 值對象 :當需要根據對象的值測量對象的相等性時使用。
  • 資料傳輸對象 :一次将具有多個屬性的資料從用戶端跨層傳遞到伺服器,以避免多次調用遠端伺服器。
  • 普通的Java舊對象 :就像簡單的類,其中包含屬性,公共的無參數構造函數。 正如我們聲明的JPA實體。

值對象模式與資料傳輸模式之間的差異