Рубрики
Без рубрики

Понимание Jakarta EE 8 – C.D.I. (Часть 3) – Определение пользовательских аннотаций CDI.

[Продолжая эту серию, мы будем ссылаться на некоторые материалы и примеры из CDI 2.x… Помечено как программирование, учебное пособие, java, джакарта.

[Продолжая эту серию, мы будем ссылаться на некоторые материалы и примеры из спецификации 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”