Боба является классом Java с именами методов , которые следуют рекомендациям Java Bean (также называемые шаблоны проектирования) для свойств , методов и событий, Таким образом, любой открытый метод класса компонента, который не является частью определения свойства, является методом компонента. Как минимум, Java-класс даже с единственным свойством в качестве свойства (разумеется, требуются сопровождающий общедоступный метод получения и установки), открытый метод в качестве единственного члена или только один метод регистрации прослушивателя общедоступных событий - это Java-бин. Кроме того, это может быть свойство только для чтения (имеет метод получения, но не метод установки) или свойство только для записи (имеет только метод установки). Java-бин должен быть публичным классом, чтобы быть видимым для любого инструмента или контейнера beanbox. Контейнер должен быть в состоянии создать его экземпляр; таким образом, он также должен иметь открытый конструктор. JavaBeansне требует, чтобы бин имел открытый конструктор с нулевыми аргументами, явный или заданный по умолчанию, для контейнера, чтобы создать его экземпляр. Если бы вы могли предоставить файл (с расширением .ser), содержащий сериализованный экземпляр, инструмент beanbox мог бы использовать этот файл для создания экземпляра прототипа bean. В противном случае компонент должен иметь открытый конструктор с нулевым аргументом, либо явный, либо заданный по умолчанию.
После создания экземпляра bean API Java Bean API (java.beans. *) Может проанализировать его и вызвать для него методы. Если класс, реализующий интерфейс BeanInfo или расширяющий реализацию BeanInfo, класс SimpleBeanInfo, недоступен, самоанализ предполагает использование отражения (неявного самоанализа) для изучения методов, поддерживаемых целевым компонентом, а затем применения простых шаблонов проектирования (руководящих принципов) для вывода из те методы, какие свойства, события и публичные методы поддерживаются. Если доступен класс, реализующий интерфейс BeanInfo (для бина Foo, он должен называться FooBeanInfo), API обходит неявный самоанализ и использует открытые методы (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) этого класса, чтобы получить Информация. Если класс, расширяющий SimpleBeanInfo, доступен, в зависимости от того, какие из открытых методов SimpleBeanInfo (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) будут переопределены, он будет использовать эти переопределенные методы для получения информации; для метода, который не переопределяется, по умолчанию используется соответствующий неявный самоанализ. В любом случае, bean-компонент должен быть создан, даже если на нем не выполняется неявный самоанализ. Таким образом, требование общедоступного конструктора zeri-args. Но, конечно, интерфейс Serializable или Externalizable не обязательно должен распознаваться. Однако спецификация Java Bean гласит: «Мы также хотели бы, чтобы это было« тривиально »для общего случая крошечного Bean, который просто хочет сохранить свое внутреннее состояние и не хочет думать об этом». Таким образом, все компоненты должны реализовывать интерфейс Serializable или Externalizable. В целом, Спецификация JavaBeans не является сложной и быстрой в отношении того, что составляет бин. «Написание компонентов JavaBeans на удивление легко. Вам не нужен специальный инструмент и вам не нужно реализовывать какие-либо интерфейсы. Написание бинов - это просто вопрос соблюдения определенных соглашений кодирования. Все, что вам нужно сделать, это сделать ваш класс похожим на бин - инструменты, использующие бины, смогут распознавать и использовать ваш бин ". Тривиально, даже следующий класс является Java Bean,
public class Trivial implements java.io.Serializable {}
Скажем, у бобового конструктора есть некоторые параметры. Предположим, что некоторые простые типы. Контейнер может не знать, какие значения им присвоить; даже если это так, результирующий экземпляр может не использоваться повторно. Это может иметь смысл, только если пользователь может настроить (указать значения), например, аннотации или файлы конфигурации xml, как в bean-компонентах Spring. И предположим, что некоторые параметры являются типами классов или интерфейсов. Опять же, контейнер может не знать, какие значения ему присвоить. Это может иметь смысл, только если пользователь может настроить (указать конкретные объекты), скажем, аннотации или файлы конфигурации xml. Однако даже в Spring (через файлы конфигурации xml) назначение определенных объектов (с именами строк) аргументам конструктора (атрибуту или элементу аргументов конструктора) не является безопасным с точки зрения типов, это в основном похоже на внедрение ресурсов. Создание ссылок на другие bean-компоненты Spring (называемые коллабораторами; через элемент в элементе аргумента конструктора) - это, по сути, внедрение зависимости и, следовательно, безопасность типов. Очевидно, что у зависимости (bean сотрудника) может быть конструктор с внедренными параметрами; эти внедренные зависимости могут иметь конструктор с параметрами и так далее. В этом сценарии, в конечном счете, вам потребуются некоторые классы bean-компонентов (например, MyBean.class), которые контейнер может создать, просто вызвав новый MyBean (), прежде чем он сможет создать другие взаимодействующие bean-компоненты посредством внедрения зависимостей в конструкторы - таким образом, требование для бины должны иметь открытый конструктор с нулевыми аргументами. Предположим, если контейнер не поддерживает внедрение зависимостей и / или не позволяет присваивать конструктору значения простого типа через некоторые аннотации или XML-файлы конфигурации, как в Spring, конструкторы бинов не должны иметь параметров. Даже приложению Spring bean-компонентов потребовалось бы, чтобы некоторые bean-компоненты имели общедоступный конструктор с нулевыми аргументами (например, в сценарии, где у вашего Spring-приложения нет bean-компонента с простыми типами в качестве аргументов конструктора).
Управляемые компоненты JSF запускаются в веб-контейнере. Их можно настроить либо с помощью аннотации @ManagedBean, либо с помощью файла ресурсов конфигурации приложения managed-bean.xml. Тем не менее, он поддерживает инъекцию только через инъекцию ресурсов (не безопасную); не подходит для инъекций на конструкторах. JSFтребует, чтобы управляемые компоненты имели открытые конструкторы с нулевым аргументом. Далее говорится: «Начиная с версии 2.3 данной спецификации, использование средства управляемых компонентов, указанного в этом разделе, настоятельно не рекомендуется. Лучшим и более согласованным решением для решения той же проблемы является использование контекстов и инъекций зависимостей (CDI), как указано в JSR-365. «Другими словами, должны использоваться управляемые bean-компоненты CDI, которые обеспечивают безопасное внедрение зависимостей на конструкторы, родственные к бинам Spring. Спецификация CDI принимает спецификацию Managed Beans, которая применяется ко всем контейнерам платформы JEE, а не только к веб-уровню. Таким образом, веб-контейнер должен реализовывать спецификацию CDI.
Вот выдержка из спецификации Managed Bean
«Управляемые компоненты - это объекты, управляемые контейнером, с минимальными требованиями, которые также известны под аббревиатурой« POJO »(простые старые объекты Java)… их можно рассматривать как расширенную платформу Java EE модели компонентов JavaBeans, найденной на платформе Java SE. .... Читатель не будет упускать из виду, что в управляемых компонентах есть предшественник в одноименном средстве, найденном в технологии JavaServer Faces (JSF)… Управляемые компоненты, как определено в этой спецификации, представляют собой обобщение элементов, найденных в JSF; в частности, управляемые компоненты могут использоваться в любом месте приложения Java EE, а не только в веб-модулях. Например, в базовой модели компонентов управляемые компоненты должны предоставлять конструктор без аргументов, но спецификацию, основанную на управляемых компонентах, такую как CDI (JSR-299), может ослабить это требование и позволить управляемым компонентам предоставлять конструкторам более сложные подписи, если они следуют некоторым четко определенным правилам ... Управляемый компонент не должен быть: конечным классом, абстрактным классом, нестатическим внутренним классом , Управляемый компонент не может быть сериализуемым в отличие от обычного компонента JavaBean ». Таким образом, спецификация для управляемых бинов, иначе называемая POJO или бобами POJO, допускает расширение, как в CDI.
Спецификация CDI переопределяет управляемые bean-компоненты следующим образом: При работе в Java EE класс Java верхнего уровня является управляемым bean-компонентом, если он соответствует требованиям:
• Это не внутренний класс. • Это неабстрактный класс или аннотированный @Decorator. • Он не реализует javax.enterprise.inject.spi.Extension. • Это не аннотировано @Vetoed или в аннотированном пакете @Vetoed. • У него есть соответствующий конструктор: либо у класса есть конструктор без параметров, либо класс объявляет конструктор с аннотацией @Inject.
Все классы Java, которые удовлетворяют этим условиям, являются управляемыми bean-компонентами, и поэтому для определения управляемого bean-компонента не требуется специального объявления. Или
если он определен как управляемый компонент в любой другой спецификации Java EE, и если
• Он не аннотируется аннотацией, определяющей компонент EJB, и не объявляется как класс EJB-компонента в ejb-jar.xml.
В отличие от Spring bean-компонентов, он не поддерживает конструкторы с простыми типами, что могло бы быть возможно, если бы он поддерживал конфигурацию с XML-файлами конфигурации, такими как Spring, или любыми аннотациями.
EJB работают в контейнере EJB. это спецификация«Компонент сессионного компонента - это управляемый компонент». «У класса должен быть открытый конструктор, который не принимает аргументов», - говорится как для сессионного компонента, так и для компонента, управляемого сообщениями. Далее сказано: «Класс сессионного компонента - это не требуется для реализации интерфейса SessionBean или интерфейса Serializable ». По той же причине, что и бины JSF, то, что внедрение зависимостей EJB3 является в основном внедрением ресурсов, компоненты JSF не поддерживают конструкторы с аргументами, то есть посредством внедрения зависимостей. Однако, если контейнер EJB реализует CDI, «необязательно: класс может иметь дополнительный конструктор, аннотированный аннотацией Inject, «он говорит и для сессионного компонента, и для компонента, управляемого сообщениями, потому что« EJB, упакованный в архив компонента CDI и не аннотированный с помощью javax.enterprise.inject.Vetoed аннотации, считается включенным CDI боб «.