Зачем нужна @Qualifier, если после нее ничего нет?



@Anrek

Добрый вечер!

Есть файл Kotlin, в котором объявляется много разных аннотаций в список (первые две для примера):

import javax.inject.Qualifier

@Qualifier
annotation class WithErrorHandler

@Qualifier
annotation class UseCaseScope
..

Что я прочитал про аннотацию: «Аннотация @Qualifier позволяет уточнить имя бина, который надо внедрить. Используется прямо перед аргументом».

Но ведь после аннотации нет скобок, в которых бы что-то уточнялось, например так:
@Qualifier("appContext1")

Вопрос: зачем здесь может быть нужна аннотация @Qualifier, если после нее ничего нет? Что я понимаю не так?


Решения вопроса 1



@Anrek Автор вопроса

Я разобрался. Есть @Qualifier из разных пакетов. Оба они касаются DI (внедрения зависимостей).

В реальной жизни может сложится ситуация, когда создаётся несколько бинов одного и того же типа (например, с 1 и тем же интерфейсом), но в конкретном случае например необходим конкретный бин. @Qualifier — аннотация позволяет уточнить какой именно.

1) Есть @Qualifier, которая импортируется из пакета CDI JSR 330 (CDI-это стандарт Java для контекстов и внедрения зависимостей, а JSR-330-это его подмножество, которое он полностью поддерживает), импортируется так:
import javax.inject.Qualifier
Ее уточнение не добавляется, просто пишется так:
@Qualifier

2) Есть @Qualifier, которая импортируется из пакета фреймворка Spring (фреймворк для внедрения зависимостей), импортируется так:

import org.springframework.beans.factory.annotation.Qualifier

И ей как раз указывается «уточнение» в скобках:
@Qualifier("appContext1")

В Spring бин называется по имени и вызывается явно по нему.

В случае JSR 330 для этого создается своя аннотация для разделения зависимостей с одинаковыми интерфейсами и затем применяется и к классу бина и к зависимости. Документ про который шла речь в вопросе как раз перечень таких аннотаций.

Итого: в Spring — определяемся с необходимым бином по его имени, а в JSR 330 — по имени его аннотации и удобно перечень всех этих аннотаций собрать в отдельный файл (что и сделали).

Источник (тут же можно и примеры посмотреть)

Комментировать

Ответы на вопрос 1



@Jacen11

Что я понимаю не так?

видимо все

ты указываешь что annotation class UseCaseScope будет уточнять какой бин. Ставишь его где создается бин и где вставлять. Обычно создается и инжектится один объект одного типа и тогда и так понятно куда вставлять. А это когда много бинов одинакового типа.

Но ведь после аннотации нет скобок, в которых бы что-то уточнялось, например так:
@Qualifier(«appContext1»)

что это должно значить и что собрался уточнять я не понял

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *