Разница между DTO, VO, POJO, JavaBeans? - PullRequest
515 голосов
/ 23 октября 2009

видели несколько похожих вопросов:

Не могли бы вы также сказать мне контексты, в которых они используются? Или цель их?

Ответы [ 7 ]

782 голосов
/ 23 октября 2009

JavaBeans

JavaBean - это класс, который следует соглашениям JavaBeans , как определено Sun. В Википедии есть довольно хорошее резюме того, что JavaBeans :

JavaBeans - это повторно используемые программные компоненты для Java, которыми можно манипулировать визуально в инструменте компоновщика. На практике это классы, написанные на языке программирования Java, соответствующем определенному соглашению. Они используются для инкапсуляции многих объектов в один объект (бин), чтобы их можно было передавать как один объект бина, а не как несколько отдельных объектов. JavaBean - это Java-объект, который сериализуем, имеет нулевой конструктор и предоставляет доступ к свойствам с использованием методов получения и установки.

Чтобы функционировать как класс JavaBean, объектный класс должен подчиняться определенным соглашениям в отношении именования, построения и поведения методов. Эти соглашения позволяют иметь инструменты, которые могут использовать, повторно использовать, заменять и подключать JavaBeans.

Обязательные условные обозначения:

  • Класс должен иметь открытый конструктор по умолчанию. Это позволяет легко создавать экземпляры в средах редактирования и активации.
  • Свойства класса должны быть доступны с использованием get, set и других методов (так называемых методов доступа и методов-мутаторов) в соответствии со стандартным соглашением об именах. Это позволяет легко автоматизировать проверку и обновление состояния компонента в рамках, многие из которых включают настраиваемые редакторы для различных типов свойств.
  • Класс должен быть сериализуемым. Это позволяет приложениям и инфраструктурам надежно сохранять, хранить и восстанавливать состояние компонента в зависимости от виртуальной машины и платформы.

Поскольку эти требования в значительной степени выражаются в виде соглашений, а не в реализации интерфейсов, некоторые разработчики рассматривают JavaBeans как простые старые объекты Java, которые следуют определенным соглашениям об именах.

POJO

Простой старый Java-объект или POJO - это термин, первоначально введенный для обозначения простого облегченного Java-объекта, не реализующего какой-либо интерфейс javax.ejb, в отличие от тяжелого EJB 2.x (особенно Entity Beans, не требующие сохранения Stateless Session Beans не плохое имо). Сегодня этот термин используется для обозначения любого простого объекта без лишних вещей. Опять же, Википедия хорошо справляется с определением POJO :

POJO является аббревиатурой от Plain Old Java Объект. Название используется, чтобы подчеркнуть что рассматриваемый объект является обычный Java-объект, а не специальный объект, и, в частности, не Enterprise JavaBean (особенно до EJB 3). Термин был придуман Мартином Фаулер, Ребекка Парсонс и Джош Маккензи в сентябре 2000 года:

«Мы удивлялись, почему люди так против использования обычных предметов в своих системы и пришли к выводу, что это было потому что простым предметам не хватало фантазии название. Итак, мы дали им один, и это завоевал популярность. "

Термин продолжает образец старые термины для технологий, которые делают не используйте необычные новые функции, такие как POTS (Обычная старая телефонная служба) в телефония и PODS (обычные старые данные Структуры), которые определены в C ++ но использовать только функции языка C, и POD (Обычная старая документация) на Perl.

Термин скорее всего получил широкое признание из-за нужно общее и легко Понятный термин, который контрастирует с сложные объектные рамки. JavaBean - это POJO, который сериализуемый, без аргументов конструктор, и позволяет получить доступ к свойства с использованием геттера и сеттера методы. Enterprise JavaBean не является один класс, но целый компонент модель (опять же, EJB 3 уменьшает сложность Enterprise JavaBeans).

Поскольку проекты с использованием POJO стали более часто используемые системы имеют возникшие, которые дают POJOs некоторые из функциональность, используемая в рамках ибольше выбора о том, какие области функциональность действительно нужна. Hibernate и Spring являются примерами.

Объект значения

Объект-значение или VO - это такой объект, как java.lang.Integer, который содержит значения (следовательно, объекты-значения). Для более формального определения я часто обращаюсь к описанию Мартина Фаулера Value Object :

В Шаблонах Архитектуры Приложения Предприятия я описал Объект Ценности как маленький объект, такой как объект Денег или диапазона дат. Их ключевое свойство заключается в том, что они следуют семантике значений, а не ссылочной семантике.

Вы обычно можете сказать им, потому что их понятие равенства не основано на идентичности, вместо этого два объекта значения равны, если все их поля равны. Хотя все поля равны, вам не нужно сравнивать все поля, если подмножество уникально - например, кодов валюты для объектов валюты достаточно для проверки равенства.

Общая эвристика заключается в том, что ценностные объекты должны быть полностью неизменными. Если вы хотите изменить объект значения, вы должны заменить объект новым и не иметь права обновлять значения самого объекта значения - обновляемые объекты значения приводят к проблемам с наложением алиасов.

В ранней литературе по J2EE термин объект значения использовался для описания другого понятия, которое я называю Data Transfer Object . С тех пор они изменили свое использование и вместо этого используют термин Transfer Object .

Вы можете найти еще несколько хороших материалов по ценным объектам в вики и Dirk Riehle .

Объект передачи данных

Объект передачи данных или DTO - это (анти) шаблон, введенный в EJB. Вместо того чтобы выполнять много удаленных вызовов в EJB, идея заключалась в том, чтобы инкапсулировать данные в объект значения, который можно передать по сети: объект передачи данных. В Википедии есть приличное определение Объект передачи данных :

Объект передачи данных (DTO), ранее известный как объекты значений или VO, - это шаблон проектирования, используемый для передачи данных между подсистемами программных приложений. DTO часто используются вместе с объектами доступа к данным для извлечения данных из базы данных.

Разница между объектами передачи данных и бизнес-объектами или объектами доступа к данным заключается в том, что DTO не имеет никакого поведения, кроме хранения и извлечения своих собственных данных (средства доступа и мутаторы).

В традиционной архитектуре EJB DTO служат двойным целям: во-первых, они решают проблему невозможности сериализации объектных компонентов; во-вторых, они неявно определяют фазу сборки, когда все данные, которые будут использоваться представлением, выбираются и направляются в DTO перед возвратом управления на уровень представления.


Итак, для многих DTO и VO - это одно и то же (но Фаулер использует VO, чтобы обозначить что-то другое, как мы видели). В большинстве случаев они следуют соглашениям JavaBeans и, таким образом, также являются JavaBeans. И все это POJO.

57 голосов
/ 23 октября 2009

DTO против VO

DTO - Объекты передачи данных - это просто контейнеры данных, которые используются для передачи данных между слоями и уровнями.

  • В основном содержит атрибуты. Вы даже можете использовать публичные атрибуты без методов получения и установки.
  • Объекты передачи данных не содержат бизнес-логики.

Аналогия:
Простая форма регистрации с атрибутами username, пароль и идентификатор электронной почты.

  • Когда эта форма отправляется в файл RegistrationServlet, вы получаете все атрибуты от уровня представления до уровня бизнес-уровня, куда вы передаете атрибуты Java-бинов, а затем DAO или персистентного уровня.
  • DTO помогает переносить атрибуты с уровня представления на бизнес-уровень и, наконец, на уровень персистентности.

DTO в основном использовался для эффективной передачи данных по сети, это может быть даже от JVM к другой JVM.

DTO часто имеют значение java.io.Serializable - для передачи данных через JVM.

VO - Объект значения [1] [2] представляет собой фиксированный набор данных и аналогичен перечислению Java. Идентичность объекта-значения основана на их состоянии, а не на идентичности объекта и является неизменной. Примером реального мира могут быть Color.RED, Color.BLUE, SEX.FEMALE и т. Д.

POJO против JavaBeans

[1] Java-Beanness POJO состоит в том, что все его частные атрибуты доступны через общедоступные методы получения и установки, которые соответствуют соглашениям JavaBeans. например, * 1 041 *

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

[2] JavaBeans должен реализовывать Serializable и иметь конструктор без аргументов, тогда как в POJO таких ограничений нет.

42 голосов
/ 15 июля 2013

В основном,

DTO: «Объекты передачи данных» могут перемещаться между отдельными уровнями в архитектуре программного обеспечения.

VO: «Объекты значения» содержат такие объекты, как целое число, деньги и т. Д.

POJO: Простой старый Java-объект, который не является специальным объектом.

Java Beans: требуется Java Class для сериализации, иметь конструктор no-arg и метод получения и установки для каждого поля

24 голосов
/ 23 октября 2009

Java Beans - это не то же самое, что EJB.

Спецификация JavaBeans в Java 1.0 была попыткой Sun разрешить манипулировать объектами Java в среде IDE, похожей на VB. Были установлены правила для объектов, которые квалифицируются как «Java Beans»:

  1. Конструктор по умолчанию
  2. Получатели и установщики для закрытых членов данных, которые соблюдают надлежащее соглашение об именах
  3. Сериализуемый
  4. Может быть, другие, которые я забыл.

EJB появились позже. Они объединяют распределенные компоненты и транзакционную модель, работающие в контейнере, который управляет потоками, пулами, жизненным циклом и предоставляет сервисы. Они далеки от бобов Java.

DTO возникли в контексте Java, потому что люди узнали, что спецификация EJB 1.0 была слишком "болтливой" с базой данных. Вместо того, чтобы делать обходные шаги для каждого элемента данных, люди будут упаковывать их в Java Beans навалом и рассылать их.

POJO были реакцией против EJB.

4 голосов
/ 17 августа 2016

POJO : Это Java-файл (класс), который не расширяет и не реализует любой другой Java-файл (класс).

Bean : Это java-файл (класс), в котором все переменные являются закрытыми, методы являются общедоступными, и для доступа к переменным используются соответствующие методы получения и установки.

Нормальный класс : Это java-файл (класс), который может состоять из переменных public / private / default / protected и может расширять или не расширять или реализовывать другой java-файл (класс).

1 голос
/ 15 декабря 2017

Первый разговор о

Нормальный класс - это означает, что любой класс определяет это обычно в Java, это означает, что вы создаете свойства метода другого типа и т. Д.
Bean - Bean - это ничто, это всего лишь объект этого конкретного класса. С помощью этого компонента вы можете получить доступ к своему Java-классу так же, как к объекту. .

и после этого поговорим о последнем POJO

POJO - POJO - это тот класс, который не имеет никаких сервисов, у него есть только конструктор по умолчанию и закрытое свойство, а также это свойство для установки значения, соответствующего методам установки и получения. Это краткая форма простого Java-объекта.

0 голосов
/ 03 мая 2019
  • Объект значения : Используйте, когда необходимо измерить равенство объектов на основе значения объектов.
  • Объект передачи данных : передача данных с несколькими атрибутами в одном кадре от клиента к серверу через слой, чтобы избежать нескольких вызовов на удаленный сервер.
  • Простой старый Java-объект : Это похоже на простой класс, свойства которого, общедоступный конструктор без аргументов. Как мы заявляем для сущности JPA.

разница между ними значением объектно-шаблоны и-данными передачи-паттерн

...