Получить все бины с квалификатором, который имеет значение привязки - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть пользовательский квалификатор в моем приложении, который можно использовать как:

@Person(name = "bob")
public class Bob implements IPerson { ... }

, где значение name квалификатора Person является обязательным.(Не помечены @Nonbinding)

Одна часть моего приложения должна знать все Person bean-компоненты, а другая часть моего приложения нуждается в доступе к определенному Person

Для доступа кконкретные Person Я могу использовать:

@Inject @Person(name = "bob")
IPerson bob;

Но как я могу получить все бины Person?Я не могу использовать

@Inject @Person(name = "")
Instance<IPersion> people;

, поскольку name является обязательным.Если я объявляю name как @Nonbinding, приведенный выше код работает, но я больше не могу вводить конкретное лицо через его имя.

В настоящее время я использую следующий метод для получения всех Person bean-компонентов:

@Inject @Any
private Instance<IPerson> people;
...
for (IPerson person : people) {
    if (hasPersonAnnotaion(person)) {...}
}

, тогда как hasPersonAnnotaion() программно проверяет класс лиц для аннотации @Person.Есть ли лучший способ?

1 Ответ

0 голосов
/ 28 февраля 2019

В текущем состоянии вашего кода @Any выглядит как лучшая ставка.При этом вам, очевидно, понадобится фильтрация, которую вы выполняете.

Хотя, зная, что вашему коду понадобятся все экземпляры с заданным квалификатором , и если фильтрация дорогая (много экземпляров без квалификатора @Person?) , вы можете захотеть добавить дополнительный квалификатор без привязки, который будет на каждом IPerson - что-то вроде @IsPerson.Тогда вы могли бы @Inject @IsPerson Instance<IPerson> people, и фильтрация не нужна.

Обратите внимание, что дополнительный классификатор не доставит вам головной боли с точки зрения существующих точек инъекции (например, @Inject @Person(name = "bob") IPerson bob; будет по-прежнему действительным).

...