Что такое JavaBean?

Я понял, я думаю, что «Бин» - это Java-класс со свойствами и геттерами / сеттерами. Насколько я понимаю, это эквивалент структуры C. Это правда?

Кроме того, существует ли реальная синтаксическая разница между компонентом и обычным классом? Есть ли какое-то особое определение или интерфейс?

В принципе, почему для этого есть термин?

И что означает интерфейс Serializable?


person Amir Rachum    schedule 21.07.2010    source источник
comment
См. места, где использовались Java Beans?. Это класс, следующий определенным соглашениям.   -  person Matthew Flaschen    schedule 21.07.2010
comment
Для полноты, вот ссылка на спецификацию JavaBeans.   -  person informatik01    schedule 20.01.2014
comment
Просто примечание. Если вы когда-нибудь слышите, как люди используют термин POJO, они часто означают Bean. Когда вы видите POJO, у них почти всегда есть сеттеры и получатели, они сериализуемы ... На самом деле POJO не требует сеттеров и получателей, сериализуемого интерфейса или чего-то еще - это просто обычный старый объект Java без каких-либо особых требований.   -  person Bill K    schedule 12.04.2019
comment
Определенно не структура, но я рад, что вы задали вопрос.   -  person Don Rolling    schedule 17.02.2021


Ответы (23)


JavaBean - это просто стандарт

  1. Все свойства являются частными (используйте методы получения / установки)
  2. Общедоступный конструктор без аргументов
  3. Реализует Serializable.

Вот и все. Это просто условность. Однако от этого зависит множество библиотек.

Что касается Serializable, из документации API :

Сериализуемость класса обеспечивается классом, реализующим интерфейс java.io.Serializable. Классы, которые не реализуют этот интерфейс, не будут иметь сериализованного или десериализованного состояния. Все подтипы сериализуемого класса сами сериализуемы. Интерфейс сериализации не имеет методов или полей и служит только для определения семантики сериализации.

Другими словами, сериализуемые объекты могут быть записаны в потоки и, следовательно, в файлы, объектные базы данных, что угодно на самом деле.

Кроме того, нет синтаксической разницы между JavaBean и другим классом - класс является JavaBean, если он соответствует стандартам.

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

person hvgotcodes    schedule 21.07.2010
comment
На мой взгляд, почти вся документация, связанная с beans, не может описать этот термин так кратко, как вы. +1 - person AndaP; 20.09.2012
comment
Обязательно ли, чтобы члены бина тоже были бобами? Вроде разумное требование .. - person worldsayshi; 06.05.2013
comment
@worldsayshi - Нет, не обязательно. Например, bean-компонент может содержать String; и String не является bean-компонентом. (Строка неизменна, поэтому вы не можете создать ее, вызвав пустой конструктор и установщик.) Кажется разумным, что объект Serializable должен иметь члены Serializable, если он каким-то образом не сериализует их извне. Итак, нет, члены Java-бинов не обязательно должны иметь какие-либо аспекты Java-бинов. Хотя более проще, если они тоже бобы. - person Viliam Búr; 02.08.2013
comment
Все свойства приватны неверны. Свойства выводятся из методов получения и установки (если есть метод X getFoo () - ›компонент имеет читаемое свойство с именем foo; если есть метод setFoo (X foo) -› компонент имеет записываемое свойство с именем foo) . Свойства могут поддерживаться полями-членами (но не обязательно), которые обычно являются частными. - person Puce; 01.12.2015
comment
Я надеюсь, что для Java-бина класс должен быть общедоступным. И действительно ли необходимо, чтобы он реализовал сериализуемый интерфейс ?? - person Satyabrata sahoo; 27.05.2016
comment
Похоже, вам не следует объявлять переменные состояния final, потому что у вас есть конструктор без аргументов. Это правильно? - person ncmathsadist; 29.05.2016
comment
@ncmathsadist, да, так и должно быть. - person Paul Wintz; 02.06.2017
comment
Большое спасибо! Почему мне пришлось искать везде, чтобы добраться до этого? Почему люди не могут быть такими же точными, как вы, со своим ответом? !! Такой крайне неинтуитивный термин для такого простого стандарта. - person mavili; 05.11.2018
comment
@Puce Я думаю, что это неправильное название связано с тем, что в других языках ООП поля-члены называются свойствами (JavaScript, PHP) или переменными экземпляра (Python). Люди, кажется, используют эти термины как синонимы. - person OzzyTheGiant; 12.04.2019
comment
Все это очень лаконично, ясно и красиво; однако в настоящее время многие люди (на курсах, в учебных пособиях или даже на переговорах) относятся к @Entity (javax.persistence.entity) как к классу Javabean, аннотированному @Entity (для сопоставления ORM) .. и .. классы @Entity делают не реализовывать java.io.Serializable .. это то, что обычно меня немного смущает, так как я очень разборчивый и перфекционистский тип человека. @Entity javabean или что-то близкое к Javabean? - person Giorgi Tsiklauri; 08.12.2019
comment
Вероятно, также стоит упомянуть, что геттеры и сеттеры должны следовать определенному соглашению об именах. Итак, если ваш метод получения для foo называется getFoo (), все в порядке. Но если бы вы назвали его чем-то тупым, например, acquTheValueOfTheFooVariable () (просто как глупый пример), то это был бы не bean-компонент. Я не уверен, разрешено ли логическим геттерам начинать с вместо get - person NateW; 04.08.2020

Есть термин, при помощи которого это звучит по-особенному. Реальность далеко не такая загадочная.

По сути, Бин:

  • является сериализуемым объектом (то есть реализует _1 _, и делает это правильно), что
  • имеет свойства, геттеры и сеттеры которых являются просто методами с определенными именами (например, getFoo() - это геттер для свойства Foo), и
  • имеет общедоступный конструктор с нулевым аргументом (поэтому он может быть создан по желанию и настроен путем установки его свойств).

Что касается Serializable: это не что иное, как интерфейс маркера (интерфейс, который не объявляет никаких функций), который сообщает Java, что реализующий класс соглашается на (и подразумевает, что он способен) сериализацию - процесс, который преобразует экземпляр в поток байтов. Эти байты могут быть сохранены в файлах, отправлены через сетевое соединение и т. Д. И содержат достаточно информации, чтобы позволить JVM (по крайней мере, той, которая знает о типе объекта) восстановить объект позже - возможно, в другом экземпляре приложение, или даже на совершенно другой машине!

Конечно, для этого класс должен соблюдать определенные ограничения. Главный из них заключается в том, что все поля экземпляра должны быть либо примитивными типами (int, bool и т. Д.), Либо экземплярами некоторого класса, который также сериализуем, либо помечены как transient, чтобы Java не пыталась их включить. (Это, конечно, означает, что transient полей не переживут обход потока. Класс, имеющий transient полей, должен быть готов к их повторной инициализации в случае необходимости.)

Класс, который не может соблюдать эти ограничения, не должен реализовывать Serializable (и, IIRC, компилятор Java даже не разрешит это сделать.)

person cHao    schedule 21.07.2010
comment
Вероятно, это глупый вопрос, но чем может быть поле экземпляра, кроме примитивного типа или экземпляра класса? - person kingfrito_5005; 29.11.2016
comment
@ kingfrito_5005: Будет одно или другое. Но если это экземпляр класса, имеет значение, является ли этот класс сериализуемым или нет. Чтобы класс был сериализуемым, его части, не являющиеся transient, должны иметь некоторый сериализуемый тип. - person cHao; 29.11.2016
comment
наверное забыл упомянуть, что у конструктора не должно быть аргументов. имеет общедоступный конструктор по умолчанию (поэтому он может быть создан по желанию и настроен путем установки его свойств). - person Amos Kosgei; 05.10.2018
comment
@AmosKosgei: Не забыл; это было бы просто лишним. Конструктор по умолчанию по определению может быть вызван без аргументов. - person cHao; 05.10.2018
comment
@Amos: Однако, когда я смотрю на это, кажется, что конструктор по умолчанию означает что-то немного другое в Java, чем в C ++. : P Заменено по умолчанию на 0-аргумент. - person cHao; 05.10.2018

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

  1. реализовать интерфейс java.io.Serializable - для сохранения состояния объекта
  2. использовать общедоступный конструктор пустых аргументов - для создания экземпляра объекта
  3. предоставить общедоступные методы получения / установки - для получения и установки значений частных переменных (свойств).
person Kamal    schedule 21.07.2010
comment
Такое простое объяснение - вот что я искал. Спасибо! - person Modo; 12.12.2019

Свойства JavaBeans

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

  1. Класс JavaBean должен реализовывать либо Serializable, либо Externalizable

  2. Класс JavaBean должен иметь конструктор без аргументов.

  3. Все свойства JavaBean должны иметь общедоступные методы установки и получения.

  4. Все переменные экземпляра JavaBean должны быть закрытыми

Пример JavaBeans

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}
person Md Azaharuddin Ali    schedule 24.01.2014
comment
Аннотации необходимы или являются частью Java Bean? - person giannis christofakis; 16.10.2015
comment
@giannischristofakis Нет, аннотации не нужны. Аннотации используются как часть Spring Framework, которая широко использует Java Beans. - person Tianxiang Xiong; 17.11.2015
comment
Зачем нужен конструктор без аргументов? - person Renato; 17.12.2015
comment
@Renato, это очень просто. подумайте о Spring, которая должна автоматически создавать экземпляр вашего bean-компонента с помощью arg-constructor ... что он будет передавать в качестве аргументов? ;) - person Alex75; 06.04.2016

Пояснение на примере.

1. import java.io.Serializable

Что касается сериализации, см. документацию.

2. частные поля

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

3. Конструктор

Открытый конструктор без аргументов.

4. геттер / сеттер

Методы получения и установки для доступа и изменения частных полей.

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}
person kenju    schedule 22.08.2015
comment
я полагаю, для тела setId(int id) вы хотели сказать this.id = id; вместо this.id = is; - person steven7mwesigwa; 26.01.2019

Java Beans используется для меньшего количества кода и большего количества работы ...

Компоненты Java Beans используются в Java EE в качестве универсального контракта для обнаружения и доступа во время выполнения. Например, JavaServer Pages (JSP) использует Java Beans в качестве объектов передачи данных между страницами или между сервлетами и JSP. Java EE JavaBeans Activation Framework использует Java Beans для интеграции поддержки типов данных MIME в Java EE. API управления Java EE использует JavaBeans в качестве основы для инструментовки ресурсов, которыми нужно управлять в среде Java EE.

О сериализации:

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

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

person HANU    schedule 23.09.2013

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

person Truong Ha    schedule 21.07.2010
comment
Не могли бы вы предоставить дополнительную информацию о развертывании проекта на нескольких серверах? Спасибо - person Hanfeng; 15.10.2013
comment
скажем, кластер с парой серверов, для Websphere эта ссылка stackoverflow.com/questions/3193345/ может помочь. - person Truong Ha; 15.10.2013

JavaBeans является стандартом, и его основные синтаксические требования четко объяснены в других ответах.

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

Если вы прочитали руководство Oracle по JavaBeans, вы сможете лучше понять в этом.

person Victor    schedule 21.05.2016
comment
Полезный пост и ссылка. Когда я думаю о beans, я действительно думаю о вещах типа Visual Builder, как показано в статье Oracle. Интересно, есть ли много других фреймворков, которые их широко используют ... - person mike rodent; 10.09.2016
comment
Мешает (глупое?) Имя? - person Peter Mortensen; 23.01.2021
comment
Вместо слова «мусор», такого как to facilitate code reuse and component-based software engineering, i.e. enable developers to build applications by assembling existing components (classes) and without having to write any code (or only have to write a little glue code)., вы могли бы привести пример того, что вы подразумеваете под упрощением повторного использования кода. - person Farid; 17.02.2021

Просто немного предыстории / обновления концепции фасоли. Во многих других ответах действительно есть «что», но не так много «почему».

Они были изобретены на ранней стадии разработки в Java как часть создания графического интерфейса пользователя. Они следовали шаблонам, которые инструментам было легко разобрать, позволяя им создавать панель свойств, чтобы вы могли редактировать атрибуты Бина. В общем, свойства Bean представляют собой элемент управления на экране (подумайте, x, y, ширина, высота, текст, ..)

Вы также можете думать об этом как о строго типизированной структуре данных.

Со временем они стали полезными для множества инструментов, которые использовали один и тот же тип доступа (например, Hibernate для сохранения структур данных в базе данных).

По мере развития инструментов они больше двигались к аннотациям, а не к разделению имен установщиков / получателей. Теперь большинству систем не требуются компоненты, они могут взять любой простой старый объект Java с аннотированными свойствами, чтобы сообщить им, как ими управлять.

Теперь я рассматриваю beans как аннотированные шары свойств - они действительно полезны только для аннотаций, которые они несут.

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

Между прочим, когда все это происходило, кто-то расширил эту концепцию до чего-то под названием Enterprise Java Beans. Это ... разные. и они достаточно сложны, чтобы многие люди чувствовали, что не понимают всей концепции Бина, и перестали использовать этот термин. Я думаю, поэтому вы обычно слышите, что бины называются POJO (поскольку каждый объект Java является POJO, это технически нормально, но когда вы слышите, как кто-то говорит POJO, они чаще всего думают о чем-то, что следует шаблону bean)

person Bill K    schedule 12.04.2019
comment
Правильно - нарушители не спрашивают у объекта его значения, просят объект сделать что-нибудь за вас) - person ARK; 30.04.2019

Согласно Википедии:

  1. Класс должен иметь общедоступный конструктор по умолчанию (без аргументов). Это позволяет легко создавать экземпляры в рамках редактирования и активации.

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

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

Для получения дополнительной информации перейдите по этой ссылке.

person Diganta    schedule 16.06.2014
comment
Разве это не было уже охвачено предыдущими ответами? - person Peter Mortensen; 22.01.2021
comment
Я уверен, что OP (и большинство из нас) здесь для объяснения, а не для копирования и вставки текста - person Farid; 17.02.2021

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

person Mike    schedule 21.07.2010

Java Bean - это класс Java (концептуальный), который должен соответствовать следующим соглашениям:

  1. У него должен быть конструктор без аргументов.
  2. Он должен быть сериализуемым.
  3. Он должен предоставлять методы для установки и получения значений свойств, известные как методы получения и установки.

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

person Raghav salotra    schedule 06.12.2016
comment
Мне нравится фраза «многократно используемый программный компонент», когда я говорю о java beans, потому что java beans вообще ничего не делают. - person Rodney P. Barbati; 15.02.2017
comment
@ Родни П. Барбати: Да, но мне кажется, что это плагиат (хотя поиск не увенчался успехом). По крайней мере, в 2016, 2017 и 2018 годах OP не учитывал большинство статей (см. Другие сообщения, например, этот пример из 2018 года ), но в этот пост включено большинство статей. Или, другими словами, стиль письма в этом посте не соответствует стилю написания других постов OP ок. 2016 г. - person Peter Mortensen; 23.01.2021

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

Объекты, составляющие основу вашего приложения и управляемые контейнером IoC Spring, называются бобы. Компонент - это объект, который создается, собирается и иным образом управляется контейнером Spring IoC. В противном случае bean-компонент - это просто один из многих объектов вашего приложения. Согласно Spring IoC.

person Balman Rawat    schedule 06.03.2016

Java Bean - это любой класс Java, который удовлетворяет следующим трем критериям:

  1. Он должен реализовывать сериализуемый интерфейс (интерфейс маркера).
  2. Конструктор должен быть общедоступным и не иметь аргументов (то, что другие называют конструктором без аргументов).
  3. У него должны быть геттеры и сеттеры.

Следует отметить, что поле serialVersionUID важно для поддержания состояния объекта.

Приведенный ниже код квалифицируется как bean-компонент:

public class DataDog implements java.io.Serializable {

private static final long serialVersionUID = -3774654564564563L;

private int id;
private String nameOfDog;

// The constructor should NOT have arguments
public DataDog () {}


/** 4. getter/setter */

// Getter(s)
public int getId() {
    return id;
}

public String getNameOfDog() {
    return nameOfDog;
}


// Setter(s)
public void setId(int id) {
    this.id = id;
}

public void setNameOfDog(String nameOfDog) {
    this.nameOfDog = nameOfDog;
}}
person Amos Kosgei    schedule 05.10.2018

Компонент - это класс Java с именами методов, которые следуют за Рекомендации JavaBean (также называемые шаблонами проектирования) для свойств, методы и events. Таким образом, любой общедоступный метод класса bean-компонента, который не является частью определения свойства, является методом bean-компонента. Как минимум, Java-класс, даже со свойством в качестве единственного члена (конечно, требуются сопутствующие общедоступные методы получения и установки), общедоступный метод в качестве единственного члена или только один метод регистрации общедоступного прослушивателя событий, является Java-компонентом. Кроме того, свойство может быть либо свойством только для чтения (имеет метод получения, но не сеттером), либо свойством только для записи (имеет только метод установки). Компонент Java должен быть общедоступным классом, чтобы быть видимым для любого инструмента или контейнера beanbox. Контейнер должен быть в состоянии создать его экземпляр; таким образом, у него тоже должен быть общедоступный конструктор. Спецификация JavaBeans не требует наличия компонента публичный конструктор с нулевыми аргументами, явный или по умолчанию, для контейнера, чтобы создать его экземпляр. Если бы вы могли предоставить файл (с расширением .ser), содержащий сериализованный экземпляр, инструмент beanbox мог бы использовать этот файл для создания экземпляра компонента-прототипа. В противном случае компоненту потребуется общедоступный конструктор с нулевым аргументом, явный или используемый по умолчанию.

После создания экземпляра компонента JavaBean API (java.beans. *) Может проанализировать его и вызвать для него методы. Если класс SimpleBeanInfo, реализующий интерфейс BeanInfo или расширяющий реализацию BeanInfo, не доступен, интроспекция включает использование отражения (неявной интроспекции) для изучения методов, поддерживаемых целевым компонентом, а затем применение простых шаблонов проектирования (руководящие принципы) для вывода из те методы, какие свойства, события и общедоступные методы поддерживаются. Если доступен класс, реализующий интерфейс BeanInfo (для компонента Foo он должен называться FooBeanInfo), API обходит неявный интроспекцию и использует общедоступные методы (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) для получения Информация. Если доступен класс, расширяющий SimpleBeanInfo, в зависимости от того, какие из общедоступных методов SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) переопределяются, он будет использовать эти переопределенные методы для получения информации; для метода, который не переопределяется, по умолчанию используется соответствующая неявная интроспекция. Компонент должен быть создан в любом случае, даже если в нем не выполняется неявная интроспекция. Таким образом, требование общедоступного конструктора zeri-args. Но, конечно, для его распознавания не требуется интерфейс Serializable или Externalizable. Однако в спецификации Java Bean сказано: «Мы также хотели бы, чтобы он был« тривиальным »для общего случая крошечного Bean, который просто хочет сохранить свое внутреннее состояние и не хочет об этом думать». beans должен реализовывать интерфейс Serializable или Externalizable.

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

public class Trivial implements java.io.Serializable {}

Компоненты, описанные ниже, являются версиями Java EE версии Java SE (JavaBeans), описанной выше. Эти описания дополнительно иллюстрируют основные идеи, изложенные выше.

Весенние бобы

Скажем, у конструктора bean-компонента есть параметры. Предположим, что это простые типы. Контейнер может не знать, какие значения им присвоить; даже если это так, полученный экземпляр не может быть повторно использован. Это может иметь смысл только в том случае, если пользователь может настраивать (указывать значения), например, аннотациями или файлами конфигурации xml, как в Spring beans. И предположим, что некоторые параметры являются типами классов или интерфейсов. Опять же, контейнер может не знать, какие значения ему присвоить. Это может иметь смысл только в том случае, если пользователь может настроить (указать конкретные объекты), скажем, с помощью аннотаций или файлов конфигурации xml. Однако даже в Spring (через файлы конфигурации xml) назначение определенных объектов (со строковыми именами) аргументам конструктора (атрибуту или элементу аргументов конструктора) не является типизированным; это в основном похоже на инъекцию ресурсов. Ссылки на другие bean-компоненты Spring (называемые соавторами; через элемент в элементе аргумента конструктора) в основном являются внедрением зависимостей и, следовательно, безопасны для типов. Очевидно, что у зависимости (компонента-сотрудника) может быть конструктор с введенными параметрами; эти внедренные зависимости могут иметь конструктор с параметрами и так далее. В этом сценарии, в конечном итоге, вам понадобятся некоторые классы bean-компонентов (например, MyBean.class), которые контейнер может создать, просто вызвав новый MyBean (), прежде чем он сможет создать другие взаимодействующие bean-компоненты посредством внедрения зависимостей в конструкторы - таким образом, требование для у beans есть общедоступный конструктор с нулевым аргументом. Предположим, что если контейнер не поддерживает внедрение зависимостей и / или не позволяет назначать значения простого типа конструктору через некоторые аннотации или файлы конфигурации xml, как в Spring, конструкторы bean-компонентов не должны иметь параметров. Даже приложению компонентов Spring потребуются некоторые компоненты, чтобы иметь общедоступный конструктор с нулевым аргументом (например, в сценарии, где ваше приложение Spring не имеет bean-компонента с простыми типами в качестве аргументов конструктора).

Управляемые компоненты JSF

Управляемые компоненты JSF запускаются в веб-контейнере. Их можно настроить либо с помощью аннотации @ManagedBean, либо с помощью файла ресурсов конфигурации приложения managed-bean.xml. Однако он поддерживает инъекцию только через инъекцию ресурсов (не типизированную); не подходит для инъекций в конструкторы. Согласно спецификации JSF управляемые компоненты должны иметь общедоступные конструкторы без аргументов. Далее говорится: «Начиная с версии 2.3 этой спецификации, использование средств управляемого компонента, как указано в этом разделе, настоятельно не рекомендуется. Лучшее и более согласованное интегрированное решение для решения той же проблемы - использование внедрения контекстов и зависимостей (CDI), как указано в JSR-365. Другими словами, будут использоваться управляемые bean-компоненты CDI, которые предлагают безопасную инъекцию зависимостей для конструкторов, подобных Spring beans. Спецификация CDI принимает спецификацию Managed Beans, которая применяется ко всем контейнерам платформы JEE, а не только к веб-уровню. Таким образом, веб-контейнер должен реализовывать спецификацию CDI.

Управляемые компоненты

Вот выдержка из спецификации управляемого компонента «Управляемые компоненты - это объекты, управляемые контейнером с минимальными требованиями, иначе известные под аббревиатурой« POJO »(Обычные старые объекты Java)… их можно рассматривать как расширенную версию платформы Java EE компонентной модели JavaBeans, присутствующей в Java. Платформа SE…. Читатель не упустит из виду, что у Managed Beans есть предшественник в одноименном средстве, найденном в технологии JavaServer Faces (JSF) ... Управляемые Beans, как определено в этой спецификации, представляют собой обобщение тех, что есть в JSF; в частности, Managed Beans можно использовать в любом месте приложения Java EE, а не только в веб-модулях. Например, в базовой модели компонентов управляемые компоненты должны предоставлять конструктор без аргументов, но спецификация, основанная на управляемых компонентах, например CDI (JSR-299), может ослабить это требование и позволить управляемым компонентам предоставлять конструкторам больше сложные сигнатуры, если они следуют некоторым четко определенным правилам ... Управляемый компонент не должен быть: конечным классом, абстрактным классом, нестатическим внутренним классом. Управляемый компонент не может быть сериализуемым, в отличие от обычного компонента JavaBean ». Таким образом, спецификация для управляемых компонентов, также известных как POJO или POJO beans, допускает расширение, как в CDI.

Компоненты CDI

Спецификация CDI переопределяет управляемые bean-компоненты как: при работе в Java EE, Java-класс верхнего уровня является управляемым компонентом, если он отвечает требованиям:

• Это не внутренний класс. • Это не абстрактный класс или аннотируется @Decorator. • Он не реализует javax.enterprise.inject.spi.Extension. • Он не аннотирован @Vetoed или в пакете с аннотацией @Vetoed. • У него есть соответствующий конструктор: либо у класса есть конструктор без параметров, либо класс объявляет конструктор с аннотацией @Inject.

Все классы Java, отвечающие этим условиям, являются управляемыми компонентами, поэтому для определения управляемого компонента не требуется специального объявления. Или

если он определен как управляемый компонент в любой другой спецификации Java EE и если

• Он не аннотирован аннотацией, определяющей компонент EJB, и не объявлен как класс EJB-компонента в ejb-jar.xml.

В отличие от bean-компонентов Spring, он не поддерживает конструкторы с простыми типами, что могло бы быть возможно, если бы он поддерживал конфигурацию с файлами конфигурации xml, например Spring, или любыми аннотациями.

EJB-компоненты

EJB запускаются в контейнере EJB. Его спецификация гласит: «Компонент сеансового компонента - это управляемый компонент. «Класс должен иметь открытый конструктор, который не принимает аргументов», - говорится в нем как для сессионного компонента, так и для компонента, управляемого сообщениями. Кроме того, в нем говорится: «Класс сеансового компонента не требуется для реализации интерфейса SessionBean или интерфейса Serializable». По той же причине, что и компоненты JSF, что внедрение зависимостей EJB3 в основном является инъекцией ресурсов, компоненты JSF не поддерживают конструкторы с аргументами, то есть посредством внедрения зависимостей. Однако, если контейнер EJB реализует CDI, «Необязательно: класс может иметь дополнительный конструктор, аннотированный аннотацией Inject», это говорит как для сессионного компонента, так и для компонента, управляемого сообщениями, потому что «EJB упакован в архив bean-компонента CDI, а не аннотированный аннотацией javax.enterprise.inject.Vetoed, считается компонентом с поддержкой CDI ».

person rps    schedule 06.09.2019
comment
Стены текста. Сможете ли вы их сломать? Возможно также добавить заголовки подразделов. - person Peter Mortensen; 23.01.2021
comment
Что это вообще должно быть? - person Farid; 17.02.2021
comment
Привет, @PeterMortensen. Спасибо, что указали. Выполнено. - person rps; 12.04.2021
comment
Привет @Farid Отсутствие разделения на подразделы, как указано здесь в комментарии Питером Мортенсеном, могло затруднить некоторую читаемость / понятность. В противном случае я прочитал здесь большинство ответов, прежде чем опубликовать свой ответ, и попытался написать лучший. Вы можете прочитать его сейчас и были бы рады услышать ваши конкретные комментарии. - person rps; 12.04.2021
comment
Этот ответ заслуживает большего количества голосов. Он не только проясняет некоторые недоразумения в отношении JavaBeans (например, общедоступный конструктор с нулевыми аргументами - это просто соглашение, а не единственный вариант, разрешенный спецификацией), но и сравнивает JavaBeans со многими другими часто встречающимися bean-компонентами для обеспечения более широкого контекста. Хорошо резюмировано. - person wlnirvana; 28.04.2021

Чтобы понять JavaBean, вам нужно заметить следующее:

JavaBean концептуален и не может представлять класс конкретных вещей.

JavaBean - это инструмент разработки, который можно визуализировать в работе многократно используемых программных компонентов.

JavaBean основан на спецификации Sun JavaBeans и может быть компонентами многократного использования. Его самая большая особенность - возможность повторного использования.

person Marcus Thornton    schedule 19.07.2013

POJO (простой старый объект Java): POJO - это обычные объекты Java без каких-либо ограничений, кроме тех навязанный языком Java.

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

Сделайте так, чтобы ваш класс реализовал интерфейс java.io.Serializable. И используйте метод writeObject () класса ObjectOutputStream для достижения сериализации.

Класс JavaBean: это специальный объект POJO, имеющий некоторые ограничения (или соглашения).

  1. Реализовать сериализацию
  2. Иметь общедоступный конструктор без аргументов
  3. Все свойства являются частными с общедоступными методами получения и установки.

Многие фреймворки, например Spring, используют объекты JavaBean.

person Parth Chauhan    schedule 08.06.2020

Если вы знакомы с C / Golang, вы никогда не слышали C bean или Go bean, потому что у них есть ключевое слово struct, позволяющее разработчикам легко определять типы структур без написания сложных ключевых слов ООП.

type User struct {
  Name string
  Age int
}

var user User

user.Name = "name"
user.Age = 18

var bytes, err = json.Marshal(user)

Ошибка Java в том, что нехватка struct типов, и разработчики находят эту нехватку серьезной.

Затем был изобретен Java Bean как еще одно скучное правило, позволяющее class притворяться struct, чтобы ваш редактор или компилятор не плакал и не кричал о вашем небезопасном доступе к членам класса.

person igonejack    schedule 15.03.2021
comment
большой, как ненавистник java???????? - person hmmftg; 22.05.2021

На практике Beans - это просто объекты, которые удобно использовать. Сериализация их означает возможность легко сохранять их (хранить в форме, которая легко восстанавливается).

Типичное использование фасоли в реальном мире:

  • простые многоразовые объекты POJO (простые старые объекты Java)
  • визуальные объекты
  • Spring использует Beans для обработки объектов (например, объект User, который необходимо сериализовать в сеансе)
  • EJB (Enterprise Java Beans), более сложные объекты, такие как JSF Beans (JSF - старая, довольно устаревшая технология) или JSP Beans

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

Как их использовать, это только ваше изобретение, но наиболее распространенные случаи я перечислил выше.

person forsberg    schedule 19.03.2020

Java Bean - это компонент или базовый строительный блок в архитектуре JavaBeans. Архитектура JavaBeans - это компонентная архитектура, которая выигрывает от возможности повторного использования и взаимодействия компонентного подхода.

Допустимая архитектура компонентов должна позволять собирать программы из стандартных блоков программного обеспечения (в данном случае Beans), возможно, предоставляемых разными поставщиками, а также позволять архитектору / разработчику выбирать компонент (Bean), понимать его возможности и включать это в приложение.

Поскольку классы / объекты являются основными строительными блоками языка ООП, такого как Java, они естественным образом претендуют на роль Bean в архитектуре JavaBeans.

Процесс преобразования простого Java-класса в Java-компонент на самом деле является не чем иным, как превращением его в повторно используемый и совместимый компонент. Это приведет к тому, что класс Java будет иметь такие возможности, как:

  1. управление свойствами, событиями и методами класса, доступными другому приложению. (У вас может быть класс BeanInfo, который сообщает только о тех свойствах, событиях и методах, которые необходимы внешнему приложению.)
  2. постоянство (быть сериализуемым или извлекаемым - это также подразумевает наличие конструкторов без аргументов, использующих переходные процессы для полей)
  3. возможность регистрироваться для событий, а также генерировать события (например, с использованием связанных свойств и ограничений)
  4. настройщики (для настройки Bean через графический интерфейс или путем предоставления документации)

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

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

person supi    schedule 30.09.2020

Аннотация Spring @Bean указывает, что метод создает компонент, которым управляет контейнер Spring.

Дополнительная ссылка: https://www.concretepage.com/spring-5/spring-bean-annotation

person Esther    schedule 01.02.2021

Выше 6 или 7 раз повторялось, что для JavaBeans требуется конструктор без аргументов.

Это НЕПРАВИЛЬНО, такого требования нет, особенно в контексте Java Spring.

Также нет упоминания об этом требовании в версии (1.01) спецификации, которая описывает API JavaBeanns (https://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/). Более того, в этой спецификации «нулевой конструктор» упоминается только 2 раза в следующих контекстах: Каждый настройщик должен иметь нулевой конструктор. Каждый PropertyEditor должен иметь нулевой конструктор.

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

person vleo    schedule 27.05.2021

Бины. Объекты, составляющие основу вашего приложения и управляемые контейнером Spring IoC, называются бинами. Компонент - это объект, который создается, собирается и иным образом управляется контейнером Spring IoC. Эти bean-компоненты создаются с использованием метаданных конфигурации, которые вы передаете контейнеру.

person Keshari Abeysinghe    schedule 07.07.2021