В чем разница между JavaBean и POJO?


210

Я не уверен в разнице. Я использую Hibernate, и в некоторых книгах они используют JavaBean и POJO как взаимозаменяемый термин. Я хочу знать, есть ли разница не только в контексте Hibernate, но и в общих понятиях.

Ответы:


252

JavaBean следует определенным соглашениям. Именование геттера / сеттера, наличие общедоступного конструктора по умолчанию, возможность сериализации и т. Д. См. Соглашения JavaBeans .

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


41
Обратите внимание, что JavaBean может быть и обычно является POJO, и многие POJO на самом деле являются JavaBean-компонентами.
Иоахим Зауэр

8
Нет, по определению POJO Java Bean не является POJO, потому что для того, чтобы считаться Java Bean, класс должен следовать определенным соглашениям о кодировании (например, иметь конструктор без аргументов, иметь методы, начинающиеся со слов «get» и / или "set") или распространяться с помощью класса BeanInfo.
Nat

15
Поскольку это соглашения , я думаю, вы можете успешно утверждать, что bean-компонент может быть POJO (например, вы не наследуете от интерфейса JavaBean или подобного)
Brian Agnew

1
Спецификация JavaBeans не в состоянии определить JavaBean, кроме очень свободно, как «программный компонент многократного использования» (или некоторые другие). Он не должен иметь конструктор без аргументов, не нуждается в методах, начинающихся с «get» или «set», не должен быть сериализуемым, даже не должен быть классом.
Том Хотин - tackline

4
В математическом плане мы можем сказать, что Javabeans образуют подмножество POJO, потому что определенные ограничения, накладываемые на POJO, делают его Javabean.
Нишит

106

Все JavaBean-компоненты являются POJO, но не все POJO-объекты являются JavaBean-компонентами.

JavaBean - это объект Java, который удовлетворяет определенным правилам программирования:

  • класс JavaBean должен реализовывать либо Serializable, либо Externalizable;
  • класс JavaBean должен иметь открытый конструктор без аргументов;
  • все свойства JavaBean должны иметь открытые методы установки и получения (в зависимости от ситуации);
  • все переменные экземпляра JavaBean должны быть закрытыми.

1
Я думал, что POJO не могут реализовать Serializable.
NaXa

10
«класс JavaBean должен иметь конструктор без аргументов»; также добавить публику здесь
Radistao

JavaBean является сериализуемым, и поэтому JavaBean НЕ является POJO.
Карлинос

25

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

Этот термин был придуман, когда Ребекка Парсонс, Джош МакКензи и я готовились к выступлению на конференции в сентябре 2000 года. В этой беседе мы говорили о многих преимуществах кодирования бизнес-логики в обычные объекты Java, а не с использованием Entity Beans. Мы задались вопросом, почему люди были против использования обычных объектов в своих системах, и пришли к выводу, что это потому, что простым объектам не хватает причудливого имени. Итак, мы дали им один, и это очень хорошо завоевало популярность.

http://www.martinfowler.com/bliki/POJO.html


7

POJO: Если класс может быть выполнен с базовым JDK, без какой-либо поддержки сторонних сторонних библиотек, то он называется POJO

JavaBean: Если класс содержит только атрибуты с аксессорами (сеттерами и геттерами), они называются javabeans. Обычно Java-бины не содержат никакой логики бизнес-процессов, а используются для хранения некоторых данных.

Все Javabeans являются POJO, но все POJO не являются Javabeans


7

Pojo - Простой старый объект Java

Класс pojo - это обычный класс без каких-либо специальностей, класс, полностью не связанный с технологией / фреймворком. Класс не реализует из технологии / фреймворка и не расширяет API-интерфейс технологии / фреймворка тем, что класс называется классом pojo.

Класс pojo может реализовывать интерфейсы и расширять классы, но суперкласс или интерфейс не должны быть технологией / фреймворком.

Примеры :

1.

class ABC{
----
}

Класс ABC не реализует или не расширяет технологии / рамки, поэтому это класс pojo.

2.

class ABC extends HttpServlet{
---
}

Класс ABC, расширяющийся от api технологии сервлетов, поэтому это не класс pojo.

3.

class ABC implements java.rmi.Remote{
----
}

Класс ABC реализуется из rmi api, поэтому это не класс pojo.

4.

class ABC implements java.io.Serializable{
---
}

этот интерфейс является частью языка Java, а не частью технологии / framework. так что это класс pojo.

5.

class ABC extends Thread{
--
}

Здесь поток также является классом языка Java, так что это также класс Pojo.

6.

class ABC extends Test{
--
}

если класс Test расширяется или реализуется из технологий / инфраструктуры, то ABC также не является классом pojo, поскольку он наследует свойства класса Test. если класс Test не является классом pojo, то класс ABC также не является классом pojo.

7.

теперь этот пункт является исключительным случаем

@Entity
class ABC{
--
}

@Entityэто аннотация, заданная hibernate api или jpa api, но все же мы можем назвать этот класс классом pojo. класс с аннотациями, данными из технологии / framework, в этом исключительном случае называется pojo class.



1

POJOSс определенными соглашениями (getter / setter, общедоступный конструктор без аргументов, приватные переменные) и находятся в действии (например, используются для чтения данных по форме) JAVABEANS.


1

В итоге: сходства и различия:

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

Все бобы JAVA являются POJO, но не все POJO являются бобами JAVA.


0

Вы видели формальные определения выше, сколько бы они ни стоили.

Но не слишком зацикливайтесь на определениях. Давайте просто посмотрим больше на смысл вещей здесь.

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

Приложения Java EE также будут использовать классы, отличные от тех, которые были реализованы как JavaBeans. Они могут использоваться при обработке входных данных или организации выходных данных, но не будут использоваться для объектов, передаваемых по сети. Следовательно, приведенные выше соображения не должны применяться к ним, если они допустимы как объекты Java. Эти последние классы упоминаются как POJO - простые старые объекты Java.

В общем, вы могли видеть Java Beans как просто объекты Java, адаптированные для использования по сети.

С 1995 года в мире программного обеспечения очень много ажиотажа и немало хулиганства.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.