В чём отличия обычного bean от bean в Spring?
Может быть вопрос сформулирован не совсем корректно, поправьте. Я пытался найти определение bean, потому что столкнулся с тем, что определения в разных источниках разные. Первое определение (ссылка для примера): JavaBean — это объект Java, который удовлетворяет определенным правилам программирования: Класс JavaBean должен реализовывать либо Serializable, либо Externalizable, Класс JavaBean должен иметь конструктор без аргументов, Все свойства JavaBean должны иметь публичные методы установки и получения, Все переменные экземпляра JavaBean должны быть закрытыми. Второе определение (ссылка для примера): В Spring-е бином (bean) называют любой класс, который управляется контейнером Spring. Плюс к этим двум определениям существует ещё таинственный Java EE Beans. Целых три определения bean в одной Java! И из-за этого возникла путаница. Очевидно, эти три определения отличаются (причём по второй ссылке ответ, который содержал в себе определение из первой ссылки, заминусили). Получается, первое определение справедливо для обычной Java, второе именно для Spring, а третье для EE? Тогда зачем обычные классы в ванильной Java называют бинами, если это обычные классы? Объясните пожалуйста.
Отслеживать
задан 5 сен 2020 в 18:50
2,141 2 2 золотых знака 16 16 серебряных знаков 46 46 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
На базовом уровне JavaBeans-это просто классы Java, которые придерживаются определенных соглашений о кодировании. В частности, классы, которые
имеют открытые конструкторы по умолчанию (без аргументов) разрешают доступ к их свойствам с помощью методов accessor (getter и setter) implement java.io.Serializable
Spring bean-это в основном объект, управляемый Spring. Более конкретно, это объект, который создается, настраивается и иным образом управляется контейнером Spring Framework. Компоненты Spring определяются в файлах конфигурации Spring (или, в последнее время, с аннотациями), создаются экземплярами контейнеров Spring и затем вводятся в приложения.
Обратите внимание, что Spring beans не всегда должны быть JavaBeans. Spring beans может не реализовывать интерфейс java.io.Serializable, может иметь аргументы в своих конструкторах и т. д.
Это самое основное различие между JavaBeans и Spring beans.
Для получения дополнительной информации обратитесь к источнику приведенного выше текста, статье Шона Абрама JavaBeans vs Spring beans vs POJOs
Разница между POJO, JavaBeans, DTO и VO
В этом руководстве мы узнаем, что такое объект передачи данных (DTO), объект значения (VO), обычный старый объект Java (POJO) и JavaBeans. Мы рассмотрим различия между ними и поймем, какой тип использовать и когда.
2. Обычный старый Java-объект
POJO , также известный как Plain Old Java Object, — это обычный объект Java, который не имеет ссылок на какой-либо конкретный фреймворк. Этот термин используется для обозначения простого легковесного объекта Java.
POJO не использует никаких соглашений об именах для свойств и методов.
Давайте определим базовый объект EmployeePOJO , который имеет три свойства:
public class EmployeePOJO private String firstName; private String lastName; private LocalDate startDate; public EmployeePOJO(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > public String name() return this.firstName + " " + this.lastName; > public LocalDate getStart() return this.startDate; > >
Как мы видим, приведенный выше объект Java определяет структуру для представления сотрудника и не зависит ни от какой структуры.
3. JavaBeans
3.1. Что такое JavaBean?
JavaBean в основном похож на POJO с некоторым строгим набором правил его реализации.
Правила определяют, что он должен быть сериализуемым, иметь нулевой конструктор и разрешать доступ к переменным с помощью методов, соответствующих соглашениям getX() и setX() .
3.2. POJO как JavaBean
Поскольку JavaBean по сути является POJO, давайте преобразуем EmployeePOJO в JavaBean, реализуя необходимые правила компонента:
public class EmployeeBean implements Serializable private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; private LocalDate startDate; public EmployeeBean() > public EmployeeBean(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > public String getFirstName() return firstName; > public void setFirstName(String firstName) this.firstName = firstName; > // additional getters and setters >
Здесь, чтобы преобразовать POJO в JavaBean, мы реализовали интерфейс Serializable , пометили свойства как private и использовали методы получения/установки для доступа к свойствам.
4. ДТО
4.1. Шаблон DTO
DTO, также называемый объектом передачи данных , инкапсулирует значения для передачи данных между процессами или сетями.
Это помогает сократить количество вызываемых методов. Включая несколько параметров или значений в один вызов, мы уменьшаем нагрузку на сеть при удаленных операциях.
Еще одним преимуществом этого шаблона является инкапсуляция логики сериализации. Это позволяет программе хранить и передавать данные в определенном формате.
DTO не имеет явного поведения. В основном это помогает сделать код слабо связанным, отделив модели предметной области от уровня представления.
4.2. Как использовать ДТО?
DTO имеют плоскую структуру без какой-либо бизнес-логики. Они используют тот же формат, что и POJO. DTO содержит только хранилище, средства доступа и методы, связанные с сериализацией или синтаксическим анализом.
DTO в основном сопоставляются с моделью предметной области и, таким образом, отправляют данные методу или серверу.
Давайте создадим EmployeeDTO , который сгруппирует все необходимые данные для создания сотрудника. Мы отправим эти данные на сервер в одном запросе, который оптимизирует взаимодействие с API:
public class EmployeeDTO private String firstName; private String lastName; private LocalDate startDate; // standard getters and setters >
Вышеупомянутый DTO взаимодействует с различными службами и обрабатывает поток данных. Этот шаблон DTO можно использовать в любой службе без ограничений фреймворка.
5. В.О.
VO, также известный как Value Object, представляет собой объект особого типа, который может содержать такие значения, как java.lang.Integer и java.lang.Long .
ВО всегда должен переопределять методы equals() и hashCode() . ВО обычно инкапсулируют небольшие объекты, такие как числа, даты, строки и т. д. Они следуют семантике значений, т. е. напрямую изменяют значение объекта и передают копии вместо ссылок.
Рекомендуется делать объекты-значения неизменяемыми. Изменение значений происходит только путем создания нового объекта, а не путем обновления значений в самом старом объекте. Это помогает понять неявный контракт, согласно которому два объекта-значения, созданные равными, должны оставаться равными.
Давайте определим EmployeeVO и переопределим методы equals() и hashCode() :
public class EmployeeVO private String firstName; private String lastName; private LocalDate startDate; public EmployeeVO(String firstName, String lastName, LocalDate startDate) this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; > // Getters @Override public boolean equals(Object obj) if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; EmployeeVO emp = (EmployeeVO) obj; return Objects.equals(firstName, emp.firstName) && Objects.equals(lastName, emp.lastName) && Objects.equals(startDate, emp.startDate); > @Override public int hashCode() return Objects.hash(firstName, lastName, startDate); > >
6. Заключение
В этой статье мы увидели определения POJO, JavaBeans, DTO и Value Objects. Мы также увидели, как некоторые платформы и библиотеки используют соглашения об именах JavaBean и как преобразовать POJO в JavaBean. Мы также рассмотрели шаблон DTO и объекты-значения, а также их использование в различных сценариях.
Как всегда, код этих примеров доступен на GitHub .
- 1. Обзор
- 2. Обычный старый Java-объект
- 3. JavaBeans
- 3.1. Что такое JavaBean?
- 3.2. POJO как JavaBean
- 4.1. Шаблон DTO
- 4.2. Как использовать ДТО?
Java Beans
Я тут подумал и решил устроить тебе еще одну маленькую лекцию, которая будет тебе очень полезна. Пока ты не работал программистом, ты, скорее всего, не сталкивался со специальной терминологией, и я хочу тебя сейчас познакомить с несколькими распространёнными понятиями.
Лет 10 назад массовое распространение получила концепция EJB – E nterprise J ava B eans.
— А что значит Java Beans?
— Bean по-английски боб. А Java Beans – это, стало быть, кофейные бобы (Java – сорт кофе). Такой айтишный юмор.
Бизнес-логику программы представляли в виде набора высокоуровневых объектов – бинов, которые умели обмениваться сообщениями, сохранять себя, находить друг друга по имени, и еще кучу всего. Обычно это достигалось за счет специального супер-навороченного родительского класса, хотя были и другие подходы. Поведение таких объектов очень регламентировалось.
Три самых известных вида EJB-бинов:
Entity Bean – бин, цель которого — хранить некоторые данные. В логику такого бина встроен механизм сохранения себя и своих полей в базу данных. Такой объект может быть уничтожен, а потом воссоздан из базы заново. Но кроме хранения данных у него нет никакой логики.
Session Bean – это функциональный бин. У каждого Session Bean есть своя функция. Один делает одно, другой другое. Такие бины работают с другими объектам и бинами, а не со своими данными.
Session Beans делятся на две категории.
Stateless Session Bean – это бин, который не хранит во внутренних переменных важных данных, нужных для его работы. Такой бин можно уничтожить, а затем заново создать, и он будет выполнять свою функцию, как и раньше.
Statefull Session Bean – это бин, который хранит у себя внутри данные, которые использует при работе. Если мы вызываем методы этого бина, то в каждом следующем вызове он может использовать часть данных, переданных ему в предыдущих. И все равно этот бин – это не то же самое, что обычный объект.
Но в использовании бинов тоже было не все так радужно, поэтому скоро маятник качнулся в обратную сторону. И разработчики стали все чаще использовать обычные объекты. Им даже придумали специальное название.
POJO ( P lain O ld J ava O bject) – старый обычный Java-объект. Такие объекты не обладали какими-то суперфункциями и не наследовались от суперобъектов. Самые обычные Java-объекты.
Когда ты познакомишься с EJB на практике, ты поймешь, в чем разница. Грубо говоря, POJO – это нож, а EJB – это швейцарский нож, по которому можно еще и звонить.
Со временем в назначении объектов/классов возникла специализация. Как результат – выделились некоторые роли, объекты которых получили новые названия.
DTO — Data Transfer Object – объект, который создается с целью быть использованным при транспортировке данных. Обычно к таким объектам два требования: а) уметь хранить данные, б) уметь сериализоваться. Т.е. их используют только для пересылки данных.
Создал объект, записал в него нужные данные из бизнес-логики, сериализовал в JSON/XML и отправил куда-надо. Или наоборот – пришло сообщение – десериализовал его в DTO-объект и вытягивай из него данные.
Entity – это объект, который хранится в базе данных. Но они не содержат никакой бизнес-логики. Можно сказать, что это – данные бизнес-модели.
Есть еще DAO – Data Access Object. Задача DAO — сохранять объекты в базу и доставать их из нее. Entity сам такой работой не занимается – он не содержит никакой логики и, следовательно, не может ничего никуда сохранять.
Взаимодействие DAO и Entity
UserEntity user = UserDAO.getUserById("1535"); if (user.getAge()>18) < user.setMobilization(true); UserDAO.save(user); >
Комментарии
UserEntity – это класс, который хранит данные о пользователе (User-Entity) UserDAO – это класс, который достает данные (объекты UserEntity) из базы и сохраняет их туда, после изменений.
Пусть это и небольшая ознакомительная лекция, но больше ты сейчас все равно не поймешь. Каждую из этих тем можно днями рассказывать, а EJB – годами.
Но я хочу, чтобы ты хотя бы представлял, о чем речь, если столкнёшься с такими вещами в разговоре, переписке, на форуме или на собеседовании.
— Гм. Спасибо, Билаабо. Да, думаю, технических терминов мне не хватает. Спасибо большое тебе еще раз.
В чем разница между JavaBean и POJO?
Я не уверен в разнице. Я использую Hibernate и в некоторых книгах используют JavaBean и POJO как взаимозаменяемый термин. Я хочу знать, есть ли разница, не только в контексте Hibernate, но и в общих понятиях. java terminology pojo
Поделиться Источник 08 сентября 2009 в 14:11
10 ответов
JavaBean следует определенным соглашениям. Имеется имя геттера/сеттера, имеется общедоступный конструктор по умолчанию, может быть сериализован и т.д. См. Конвенции JavaBeans для получения более подробной информации. POJO (plain-old-Java-object) не определен строго. Это объект Java, который не требует реализовывать определенный интерфейс или вытекать из определенного базового класса, или использовать определенные аннотации, чтобы быть совместимым с заданным фреймворком, и может быть любым произвольным (часто относительно простым) объектом Java.
Поделиться 08 сентября 2009 в 14:18
- класс JavaBean должен реализовывать Serializable или Externalizable;
- класс JavaBean должен иметь публичный конструктор без аргументов;
- все свойства JavaBean должны иметь публичные методы сеттера и геттера (в зависимости от обстоятельств);
- все переменные экземпляра JavaBean должны быть приватными.
Поделиться 22 июля 2014 в 11:52
Согласно Мартину Фаулеру, POJO — это объект, который инкапсулирует бизнес-логику, в то время как Bean (за исключением определения, уже изложенного в других ответах) — это немного больше, чем контейнер для хранения данных, а доступные операции с объектом просто устанавливаются и получают данные.
Термин был придуман, когда Ребекка Парсонс, Джош Маккензи и я готовились к выступлению на конференции в сентябре 2000 года. В выступлении мы указывали на много преимуществ кодирования бизнес-логики в обычные объекты Java, а не использования Entity Beans. Мы задавались вопросом, почему люди так против использования обычных объектов в своих системах и пришли к выводу, что это происходит потому, что простые объекты не имеют фантастического имени. Поэтому мы дали им одно, и оно очень хорошо запечатлено.
http://www.martinfowler.com/bliki/POJO.html
Поделиться 12 октября 2015 в 07:23
Pojo — Обычный старый объект Java
класс pojo — это обычный класс без специальных особенностей, класс полностью свободно связан с технологией/фреймворком. Класс не реализуется из технологии/фреймворка и не расширяется из технологии/фреймворка API, который называется классом pojo.
класс pojo может реализовывать интерфейсы и расширять классы, но супер-класс или интерфейс не должен быть технологией/фреймворком.
class ABC
класс ABC не реализует или не расширяется из технологии/фреймворка. Вот почему это класс pojo.
class ABC extends HttpServlet
класс ABC расширяется из технологии сервлета API, поэтому это не класс pojo.
class ABC implements java.rmi.Remote
класс ABC реализуется из rmi api, поэтому это не класс pojo.
class ABC implements java.io.Serializable
этот интерфейс является частью языка Java, а не частью технологии/фреймворка. поэтому это класс pojo.
class ABC extends Thread
здесь thread также является классом языка Java, поэтому это также класс pojo.
class ABC extends Test
если класс Test расширяется или реализуется из технологий/фреймворка, то ABC также не является классом pojo, потому что наследует свойства класса Test. если класс Test не является классом pojo, то ABC также не является классом pojo.
теперь это исключительный случай
@Entity class ABC
@Entity — это аннотация, предоставленная hibernate api или jpa api, но мы все еще можем назвать этот класс как класс pojo. класс с аннотациями, предоставленными из технологии/фреймворка, называется классом pojo в этом исключительном случае.
Поделиться 06 августа 2017 в 07:26
POJO: Если класс может быть выполнен с базовым JDK без поддержки каких-либо других сторонних библиотек, то его называют POJO
JavaBean: Если класс содержит только атрибуты с аксессорами (сеттерами и геттерами), то они называются javabeans. Java beans обычно не содержат логики работы, а используются для хранения некоторых данных в нем.
Все javabeans являются POJO, но все POJO не являются javabeans
Поделиться 26 мая 2017 в 05:41
Java beans — это специальный тип POJOs.
Специальные возможности, перечисленные ниже, имеют причину
Поделиться 29 ноября 2019 в 13:08
Вкратце: сходства и различия:
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 Bean являются POJO, но не все POJO являются JAVA Bean.
Поделиться 06 марта 2019 в 01:01
POJOS с определенными соглашениями (getter/setter, public no-arg constructor, private variables) и находятся в действии (например, используются для чтения данных по форме) — это JAVABEANS .
Поделиться 22 апреля 2016 в 08:54
Все Pojo(ы) являются JavaBean(ами), но не наоборот.
Что такое POJO?
- POJO не имеет соглашения о именовании для свойств или методов. Мы не следуем никаким реальным соглашениям о создании, доступе и изменении состояния класса. Пример:
public class Pojo < public String firstname; public String LASTName; public String name() < return this.firstname + " " + this.LASTName; >>
Термин, скорее всего, получил широкое признание из-за необходимости общего и легко понятного термина, который контрастирует с сложными объектными фреймворками.[2]
Отражение с использованием POJO.
это может ограничить возможность фреймворка предпочитать конвенцию конфигурации, понимать, как использовать класс, и улучшить его функциональность.[1]
List propertyNames = Arrays.stream(PropertyUtils.getPropertyDescriptors(Pojo.class)) .map(PropertyDescriptor::getDisplayName) .collect(Collectors.toList()); System.out.println(propertyNames);
Если мы используем сторонние библиотеки PropertyUtils для размышлений, мы можем столкнуться с проблемами, так как это приведет к
Что такое Java Beans?
- Уровни доступа — наши свойства являются приватными, и мы раскрываем геттеры и сеттеры.
- Имена методов — наши геттеры и сеттеры следуют соглашению getX и setX (в случае логического, isX может быть использован для геттера)
- Конструктор по умолчанию — должен присутствовать конструктор без аргументов, чтобы можно было создать экземпляр без предоставления аргументов, например во время десериализации
- Сериализуемый — реализация интерфейса Serializable позволяет нам хранить состояние.
@Getter @Setter class Pojo implements Serializable
Отражение с использованием Java Bean.
Если мы снова используем сторонние библиотеки, такие как `PropertyUtils` для отражения, результат будет другим
[firstName,lastName]
Поделиться 20 января 2022 в 08:57
Вы видели вышеприведенные формальные определения, ибо они стоят того.
Но не зацикливайтесь на определениях. Давайте посмотрим больше на sense вещей здесь.
JavaBeans используются в приложениях Enterprise Java, где пользователи часто получают доступ к данным и/или коду приложения удаленно, т.е. с сервера (через веб или частную сеть) через сеть. Поэтому соответствующие данные должны быть переданы в последовательном формате на компьютеры пользователей или из них — поэтому необходимость в объектах Java EE реализовать интерфейс Serializable. Эта природа JavaBean не отличается от объектов приложений Java SE, данные которых читаются из файловой системы или записываются в файловую систему. Надежное использование классов Java по сети из ряда комбинаций пользовательских машин/ОС также требует принятия соглашений для их обработки. Поэтому требование о реализации этих классов как публичных, с частными атрибутами, конструктором без аргументов и стандартными геттерами и сеттерами.
Приложения Java EE также будут использовать классы, отличные от тех, которые были реализованы как JavaBeans. Они могут использоваться для обработки входных данных или организации выходных данных, но не будут использоваться для объектов, передаваемых по сети. Поэтому вышеуказанные соображения не нужно применять к ним, чтобы они были действительными как объекты Java. Эти последние классы называются POJOs — простые старые объекты Java.
В общем, вы можете видеть Java Beans как просто объекты Java, адаптированные для использования в сети.
В мире программного обеспечения с 1995 года существует огромное количество шума — и не мало шума.