Unterschied zwischen DTO, VO, POJO, JavaBeans?


584

Habe einige ähnliche Fragen gesehen:

Können Sie mir bitte auch die Kontexte mitteilen, in denen sie verwendet werden? Oder der Zweck von ihnen?


1
POJO kommt ohne Einschränkung, wo Javabohnen mit Einschränkungen kommen, die oben erwähnt wurden
exexzian

Antworten:


848

JavaBeans

Eine JavaBean ist eine Klasse, die den von Sun definierten JavaBeans-Konventionen folgt . Wikipedia hat eine ziemlich gute Zusammenfassung dessen, was JavaBeans sind:

JavaBeans sind wiederverwendbare Softwarekomponenten für Java, die in einem Builder-Tool visuell bearbeitet werden können. In der Praxis handelt es sich um Klassen, die in der Programmiersprache Java geschrieben sind und einer bestimmten Konvention entsprechen. Sie werden verwendet, um viele Objekte in ein einzelnes Objekt (die Bean) zu kapseln, sodass sie als einzelnes Bean-Objekt anstatt als mehrere einzelne Objekte weitergegeben werden können. Eine JavaBean ist ein Java-Objekt, das serialisierbar ist, einen Null-Konstruktor hat und den Zugriff auf Eigenschaften mithilfe von Getter- und Setter-Methoden ermöglicht.

Um als JavaBean-Klasse zu fungieren, muss eine Objektklasse bestimmte Konventionen bezüglich der Benennung, Konstruktion und des Verhaltens von Methoden befolgen. Diese Konventionen ermöglichen Tools, mit denen JavaBeans verwendet, wiederverwendet, ersetzt und verbunden werden können.

Die erforderlichen Konventionen sind:

  • Die Klasse muss einen öffentlichen Standardkonstruktor haben. Dies ermöglicht eine einfache Instanziierung innerhalb von Bearbeitungs- und Aktivierungsframeworks.
  • Auf die Klasseneigenschaften muss mit get, set und anderen Methoden (sogenannten Accessor-Methoden und Mutator-Methoden) gemäß einer Standard-Namenskonvention zugegriffen werden können. Dies ermöglicht eine einfache automatisierte Überprüfung und Aktualisierung des Bean-Status innerhalb von Frameworks, von denen viele benutzerdefinierte Editoren für verschiedene Arten von Eigenschaften enthalten.
  • Die Klasse sollte serialisierbar sein. Auf diese Weise können Anwendungen und Frameworks den Status der Bean zuverlässig und unabhängig von der VM und der Plattform speichern, speichern und wiederherstellen.

Da diese Anforderungen größtenteils als Konventionen und nicht durch die Implementierung von Schnittstellen ausgedrückt werden, betrachten einige Entwickler JavaBeans als einfache alte Java-Objekte, die bestimmten Namenskonventionen folgen.

POJO

Ein einfaches altes Java-Objekt oder POJO ist ein Begriff, der ursprünglich eingeführt wurde, um ein einfaches, leichtes Java-Objekt zu bezeichnen, das keine javax.ejbSchnittstelle implementiert , im Gegensatz zu schwerem EJB 2.x (insbesondere Entity Beans, Stateless Session Beans sind keine so schlechte IMO). Heutzutage wird der Begriff für jedes einfache Objekt ohne zusätzliches Material verwendet. Auch hier leistet Wikipedia gute Arbeit bei der Definition von POJO :

POJO ist eine Abkürzung für Plain Old Java Object. Der Name wird verwendet, um hervorzuheben, dass das betreffende Objekt ein gewöhnliches Java-Objekt ist, kein spezielles Objekt und insbesondere keine Enterprise-JavaBean (insbesondere vor EJB 3). Der Begriff wurde im September 2000 von Martin Fowler, Rebecca Parsons und Josh MacKenzie geprägt:

"Wir haben uns gefragt, warum die Leute so dagegen sind, normale Objekte in ihren Systemen zu verwenden, und sind zu dem Schluss gekommen, dass einfache Objekte keinen ausgefallenen Namen haben. Also haben wir ihnen einen gegeben, und er hat sich sehr gut durchgesetzt."

Der Begriff setzt das Muster älterer Begriffe für Technologien fort, die keine ausgefallenen neuen Funktionen verwenden, wie POTS (Plain Old Telephone Service) in der Telefonie und PODS (Plain Old Data Structures), die in C ++ definiert sind, aber nur C-Sprachfunktionen verwenden. und POD (Plain Old Documentation) in Perl.

Der Begriff hat höchstwahrscheinlich breite Akzeptanz gefunden, da ein allgemeiner und leicht verständlicher Begriff erforderlich ist, der im Gegensatz zu komplizierten Objektrahmen steht. Eine JavaBean ist ein POJO, das serialisierbar ist, einen Konstruktor ohne Argumente hat und den Zugriff auf Eigenschaften mithilfe von Getter- und Setter-Methoden ermöglicht. Eine Enterprise JavaBean ist keine einzelne Klasse, sondern ein gesamtes Komponentenmodell (EJB 3 reduziert wiederum die Komplexität von Enterprise JavaBeans).

Mit zunehmender Verbreitung von Designs mit POJOs sind Systeme entstanden, die POJOs einen Teil der in Frameworks verwendeten Funktionen und eine größere Auswahl darüber bieten, welche Funktionsbereiche tatsächlich benötigt werden. Winterschlaf und Frühling sind Beispiele.

Wertobjekt

Ein Wertobjekt oder VO ist ein Objekt java.lang.Integer, das Werte enthält (daher Wertobjekte). Für eine formalere Definition verweise ich oft auf Martin Fowlers Beschreibung des Wertobjekts :

In Patterns of Enterprise Application Architecture habe ich Value Object als kleines Objekt beschrieben, z. B. als Money- oder Datumsbereichsobjekt. Ihre Schlüsseleigenschaft ist, dass sie eher der Wertesemantik als der Referenzsemantik folgen.

Sie können es ihnen normalerweise sagen, weil ihr Begriff der Gleichheit nicht auf Identität basiert, sondern zwei Wertobjekte gleich sind, wenn alle ihre Felder gleich sind. Obwohl alle Felder gleich sind, müssen Sie nicht alle Felder vergleichen, wenn eine Teilmenge eindeutig ist. Beispielsweise reichen Währungscodes für Währungsobjekte aus, um die Gleichheit zu testen.

Eine allgemeine Heuristik ist, dass Wertobjekte vollständig unveränderlich sein sollten. Wenn Sie ein Wertobjekt ändern möchten, sollten Sie das Objekt durch ein neues ersetzen und dürfen die Werte des Wertobjekts selbst nicht aktualisieren. Aktualisierbare Wertobjekte führen zu Aliasing-Problemen.

In der frühen J2EE-Literatur wurde der Begriff Wertobjekt verwendet, um einen anderen Begriff zu beschreiben, den ich als Datenübertragungsobjekt bezeichne . Sie haben seitdem ihre Verwendung geändert und verwenden stattdessen den Begriff Übertragungsobjekt .

Weitere gute Materialien zu Wertobjekten finden Sie im Wiki und bei Dirk Riehle .

Datenübertragungsobjekt

Data Transfer Object oder DTO ist ein (Anti) Muster, das mit EJB eingeführt wurde. Anstatt viele Fernaufrufe an EJBs durchzuführen, bestand die Idee darin, Daten in einem Wertobjekt zu kapseln, das über das Netzwerk übertragen werden kann: einem Datenübertragungsobjekt. Wikipedia hat eine anständige Definition von Datenübertragungsobjekt :

Das Datenübertragungsobjekt (DTO), früher als Wertobjekte oder VO bekannt, ist ein Entwurfsmuster, das zum Übertragen von Daten zwischen Softwareanwendungssubsystemen verwendet wird. DTOs werden häufig in Verbindung mit Datenzugriffsobjekten verwendet, um Daten aus einer Datenbank abzurufen.

Der Unterschied zwischen Datenübertragungsobjekten und Geschäftsobjekten oder Datenzugriffsobjekten besteht darin, dass ein DTO kein Verhalten außer dem Speichern und Abrufen seiner eigenen Daten (Zugriffsmethoden und Mutatoren) aufweist.

In einer traditionellen EJB-Architektur dienen DTOs zwei Zwecken: Erstens umgehen sie das Problem, dass Entity-Beans nicht serialisierbar sind. Zweitens definieren sie implizit eine Assemblyphase, in der alle von der Ansicht zu verwendenden Daten abgerufen und in die DTOs gemarshallt werden, bevor die Kontrolle an die Präsentationsebene zurückgegeben wird.


Für viele Menschen sind DTOs und VOs dasselbe (aber Fowler verwendet VOs, um etwas anderes zu bedeuten, wie wir gesehen haben). Meistens folgen sie den JavaBeans-Konventionen und sind daher auch JavaBeans. Und alle sind POJOs.


1
Wenn ich also eine Convenience-Klasse habe, die nur zum Übertragen von nicht verwandten Daten wie dieser class SomeClass { public String foo;public String bar; }innerhalb einer Klasse mit viel komplizierter Logik erstellt wurde, ist es sicher keine JavaBean, es kann keine VO sein, da es veränderlich ist, könnte es eine sein DTO? Obwohl es nicht für entfernte Aufrufe jeglicher Art vorgesehen ist. Darf es als POJO angesehen werden?
Jaime Hablutzel

3
@ user2601512: Es wäre immer noch eine Bohne. : P Es ist nichts Falsches daran, dass eine Bohne Verhalten hat - tatsächlich wird es so ziemlich erwartet. Wenn es nichts anderes tut, ist es im Grunde ein DTO.
CHao

7
@xSNRG: Zum Teil, weil Objekte zu Daten herabgestuft werden, auf die anderer Code einwirkt. Dies ist aus OO-Sicht ein Rückschritt, bei dem Objekte handeln und für ihren eigenen Zustand verantwortlich sein sollten. DTOs sind gelegentlich eine anständige Lösung, wenn Sie tatsächlich nur Daten übertragen - daher der Name -, aber die Kapselung im Grunde genommen aus dem Fenster geht und Sie normalerweise alle Gültigkeits- / Konsistenzgarantien verlieren, die ein reales Objekt bieten könnte.
CHao

1
@ KumaresanPerumal: Sie können, wenn Sie wollen. Das Modell unterscheidet sich jedoch von der Datenschicht und hat unterschiedliche Ziele und Regeln. Die Datenschicht benötigt normalerweise alles, was angeordnet und willkürlich einstellbar ist, und das Modell möchte idealerweise Daten verbergen und Invarianten erzwingen. Wenn Sie Modellobjekte für die Speicherung verwenden möchten, müssen Sie auf der einen oder anderen Seite Kompromisse eingehen.
CHao

1
@KumaresanPerumal: Die Datenschicht dient zum Speichern und Abrufen von Daten. Dazu benötigt es fast den vollständigen Zugriff auf das Objekt, in dem sich die Daten befinden, da beim Abrufen Werte in einem Objekt irgendwo festgelegt werden. Das Modell verwaltet diese Daten jedoch innerhalb des Systems und ist an OO-Prinzipien wie die Kapselung gebunden - die Idee, dass Objekte die Kontrolle über ihren internen Zustand behalten und keinen anderen Code haben, der willkürlich mit ihren Innereien herumspielt. DTOs können diese Lücke schließen. Die Datenschicht kann nach Belieben darauf zugreifen, und das Modell muss nicht auf die Kontrolle verzichten.
CHao

66

DTO gegen VO

DTO - Datenübertragungsobjekte sind nur Datencontainer, mit denen Daten zwischen Ebenen und Ebenen transportiert werden.

  • Es enthält hauptsächlich Attribute. Sie können sogar öffentliche Attribute ohne Getter und Setter verwenden.
  • Datenübertragungsobjekte enthalten keine Geschäftslogik.

Analogie:
Einfaches Registrierungsformular mit den Attributen Benutzername, Passwort und E-Mail-ID.

  • Wenn dieses Formular in der RegistrationServlet-Datei gesendet wird, erhalten Sie alle Attribute von der Ansichtsebene zur Geschäftsschicht, wo Sie die Attribute an Java Beans und dann an das DAO oder die Persistenzschicht übergeben.
  • DTOs helfen beim Transport der Attribute von der Ansichtsebene zur Geschäftsschicht und schließlich zur Persistenzschicht.

DTO wurde hauptsächlich verwendet, um Daten effizient über das Netzwerk zu transportieren, möglicherweise sogar von JVM zu einer anderen JVM.

DTOs sind häufig java.io.Serializable- um Daten über JVM zu übertragen.

VO - Ein Wertobjekt [1] [2] stellt selbst einen festen Datensatz dar und ähnelt einer Java-Enumeration. Die Identität eines Wertobjekts basiert eher auf seinem Status als auf seiner Objektidentität und ist unveränderlich. Ein Beispiel aus der Praxis wäre Color.RED, Color.BLUE, SEX.FEMALE usw.

POJO gegen JavaBeans

[1] Die Java-Beanness eines POJO besteht darin, dass auf seine privaten Attribute alle über öffentliche Getter und Setter zugegriffen wird, die den JavaBeans-Konventionen entsprechen. z.B

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

[2] JavaBeans müssen Serializable implementieren und einen Konstruktor ohne Argumente haben, während in POJO diese Einschränkungen nicht gelten.


Entschuldigung für den Kommentar sooooo spät, aber ich lerne über die Unterschiede zwischen ihnen und ich habe eine Frage. Was ist, wenn ich eine Java Bean-Klasse habe, aber mit anderen Methoden wie doSomething (). Was für eine Klasse wäre das? Grüße
jscherman

@srinivas warum können wir die Daten nicht in DOMAIN oder MODEL Java Objekt übergeben? Aber ich benutze MODEL ohne DTO. Bitte erkläre mich kurz. danke
Kumaresan Perumal

46

Grundsätzlich,

DTO: "Datenübertragungsobjekte" können in der Softwarearchitektur zwischen verschiedenen Ebenen wechseln.

VO: "Wertobjekte" enthalten ein Objekt wie Integer, Money usw.

POJO: Einfaches altes Java-Objekt, das kein spezielles Objekt ist.

Java Beans: Erfordert Java Class, dass a serialisierbar ist, einen no-argKonstruktor sowie einen Getter und Setter für jedes Feld hat


Diese Beschreibungen sind meist falsch / unvollständig.
Cellepo

24

Java Beans sind nicht dasselbe wie EJBs.

Die JavaBeans-Spezifikation in Java 1.0 war der Versuch von Sun, die Manipulation von Java-Objekten in einer IDE zu ermöglichen, die wie VB aussah. Für Objekte, die als "Java Beans" qualifiziert waren, wurden Regeln festgelegt:

  1. Standardkonstruktor
  2. Getter und Setter für private Datenelemente, die der richtigen Namenskonvention folgten
  3. Serialisierbar
  4. Vielleicht andere, die ich vergesse.

EJBs kamen später. Sie kombinieren verteilte Komponenten und ein Transaktionsmodell, das in einem Container ausgeführt wird, der Threads, Pooling und Lebenszyklus verwaltet und Services bereitstellt. Sie sind weit entfernt von Java Beans.

DTOs entstanden im Java-Kontext, weil die Leute herausfanden, dass die EJB 1.0-Spezifikation mit der Datenbank zu "gesprächig" war. Anstatt für jedes Datenelement eine Rundreise zu machen, packten die Leute sie in großen Mengen in Java Beans und versendeten sie herum.

POJOs waren eine Reaktion gegen EJBs.


1
Ich habe mich geirrt und meine Nachricht lieber gelöscht. Danke für die Korrektur. Ich möchte feststellen, dass sich die POJO-Bedeutung vor einiger Zeit geändert hat. Erstens bestehen sie nur aus Privateigentum und ihren Zugangsmitteln. Nun betrachten wir ein POJO als eine Klasse mit Anmerkungen, Implementierung und Erweiterung anderer Klassen usw.
sinuhepop

Was ist mit VO, wie die Frage gestellt hat? Dies ist keine Antwort, bis die vollständige Frage beantwortet ist
cellepo

4

POJO : Es ist eine Java-Datei (Klasse), die keine andere Java-Datei (Klasse) erweitert oder implementiert.

Bean : Es handelt sich um eine Java-Datei (Klasse), in der alle Variablen privat sind, Methoden öffentlich sind und geeignete Getter und Setter für den Zugriff auf Variablen verwendet werden.

Normale Klasse : Dies ist eine Java-Datei (Klasse), die aus öffentlichen / privaten / Standard- / geschützten Variablen bestehen kann und die eine andere Java-Datei (Klasse) erweitern oder implementieren kann oder nicht.


Was ist mit VO, wie die Frage gestellt hat? Dies ist keine Antwort, bis die vollständige Frage beantwortet ist
cellepo

1

Erstes Gespräch über

Normale Klasse - das bedeutet, dass jede Klasse definiert, die normalerweise in Java verwendet wird. Dies bedeutet, dass Sie verschiedene Arten von Methodeneigenschaften usw. erstellen .
Bean - Bean ist nichts anderes als ein Objekt dieser bestimmten Klasse. Mit dieser Bean können Sie auf Ihre Java-Klasse genauso zugreifen wie auf ein Objekt. .

und danach über das letzte POJO sprechen

POJO - POJO ist die Klasse, die keine Dienste hat. Sie hat nur einen Standardkonstruktor und eine private Eigenschaft sowie diese Eigenschaft zum Festlegen eines Werts, der den Setter- und Getter-Methoden entspricht. Es ist eine Kurzform von Plain Java Object.


Was ist mit VO, wie die Frage gestellt hat? Dies ist keine Antwort, bis die vollständige Frage beantwortet ist
cellepo

1
  • Wertobjekt : Wird verwendet, wenn die Gleichheit der Objekte basierend auf dem Wert der Objekte gemessen werden muss.
  • Datenübertragungsobjekt: Übergeben Sie Daten mit mehreren Attributen auf einmal von Client zu Server über mehrere Ebenen hinweg, um mehrere Anrufe an den Remote-Server zu vermeiden.
  • Einfaches altes Java-Objekt : Es ist wie eine einfache Klasse, deren Eigenschaften ein öffentlicher Konstruktor ohne Argumente ist. Wie wir für JPA Entity deklarieren.

Differenz-zwischen-Wert-Objekt-Muster-und-Daten-Übertragungsmuster

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.