[Продолжая эту серию, мы будем ссылаться на некоторые материалы и примеры из спецификации CDI 2.x ].
Спецификация CDI позволяет разработчикам гибко создавать новые типы, которые находятся в пределах области видимости объявления типа компонента. В этом примере мы рассмотрим и узнаем, как легко создавать пользовательские аннотации CDI для определения:
- Новые типы квалификаторов.
- Новые Стереотипы.
Определение новых типов квалификаторов.
Тип квалификатора – это аннотация Java, определенная как @Retention(ВРЕМЯ выполнения)
. Обычно тип определителя определяется как @Target({МЕТОД, ПОЛЕ, ПАРАМЕТР, ТИП})
.
Определение типа квалификатора может быть объявлено путем указания @javax.inject. Квалификатор
мета-аннотация.
В нашем примере мы создали 2 определяемых сервисом типа квалификаторов, @Jabbawockee
и @LesTwins
отборочные.
@Qualifier @Documented @Retention(RUNTIME) @Target({ TYPE, FIELD, METHOD, PARAMETER }) public @interface Jabbawockee { }
@Qualifier @Documented @Retention(RUNTIME) @Target({ TYPE, FIELD, METHOD, PARAMETER }) public @interface LesTwins { }
И компонент квалифицируется путем аннотирования класса компонента или метода производителя или поля с типом квалификатора.
@Jabbawockee public class JabbawockeeService implements Service { public void doWork() { System.out.println("Jabbawockee doing the work."); } }
Стереотипы
Спецификация Java EE определяет стереотипы как:
Стереотип – это своего рода аннотация, применяемая к компоненту, которая включает в себя другие аннотации. Стереотипы могут быть особенно полезны в больших приложениях, в которых у вас есть несколько компонентов, выполняющих аналогичные функции.
Хорошо известные стереотипы, известные корпоративным разработчикам Java, взяты из Spring Framework: @Component
, @Service
и @Repository
стереотипы.
Стереотип – это аннотация, аннотированная @Стереотип
( @javax.enterprise.inject. Стереотип
), который содержит несколько других аннотаций. Например, чтобы воссоздать 3 стереотипа из Spring Framework в вашем приложении Java EE:
@Stereotype @Target(TYPE) @Retention(RUNTIME) @Documented @Named public @interface Component {}
Обратите внимание, что наш Component
stereotype был объявлен с пустой аннотацией @Named
, которая указывает, что каждый компонент со стереотипом имеет имя по умолчанию, если имя явно не указано компонентом. Квалификатор @Named
, объявленный стереотипом, не добавляется к квалификаторам компонента со стереотипом.
Если стереотип объявляет непустую аннотацию @Named
, контейнер автоматически обнаруживает проблему и рассматривает ее как ошибку определения.
@Stereotype @Target(TYPE) @Retention(RUNTIME) @Component //Note that Spring specifies that this annotation is a specialization of Component annotation. public @interface Service {}
@Stereotype @Target(TYPE) @Retention(RUNTIME) public @interface Repository {}
Стереотип можно задать с помощью привязок перехватчика, аннотируя стереотип типами привязок перехватчика. Например, чтобы иметь транзакционный бизнес-сервис, мы можем аннотировать наш стереотип Service
с помощью @Transactional
.
@Stereotype @Target(TYPE) @Retention(RUNTIME) @Transactional @Component public @interface Service {}
Кроме того, область действия стереотипа по умолчанию определяется путем аннотирования стереотипа типом области действия. Стереотип может объявлять не более одной области видимости. Если стереотип объявляет более одной области видимости, контейнер автоматически обнаруживает проблему и рассматривает ее как ошибку определения.
Например, в нашем Controller
stereotype мы можем указать тип области действия по умолчанию @RequestScoped
:
@RequestScoped @Stereotype @Target(TYPE) @Retention(RUNTIME) @Documented @Named public @interface Component {}
Встроенный стереотип.
Структура CDI предоставляет нам встроенный стереотип @javax.enterprise.inject. Model
, который предназначен для использования с компонентами, которые определяют уровень model архитектуры веб-приложений MVC, таких как серверные грани Jakarta.
@Named @RequestScoped @Stereotype @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface Model {}
В следующей статье мы рассмотрим производителей (метод производителя и поле производителя), ввод с использованием @Products
и декораторов, используя аннотацию @Decorator
.
Оригинал: “https://dev.to/theelitegentleman/understanding-jakarta-ee-8-c-d-i-part-3-defining-custom-cdi-annotations-5bl”