Компонент - это класс 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