Как программно внедрить компонент CDI по имени класса

#jakarta-ee #cdi

#джакарта-ee #cdi

Вопрос:

У меня есть компонент, помеченный @Example. Этот компонент реализует некоторый интерфейс IExample . Я хочу программно внедрить этот компонент, используя его имя класса, но я не хочу указывать его квалификатор.
Я получаю ошибку неудовлетворенной зависимости, потому что он ищет компонент с помощью @Any, а этот компонент имеет @Any и @Example, которые по какой-то причине не удовлетворяют.

Возможно ли это сделать в CDI?

Комментарии:

1. Почему у вас должен быть квалификатор, а затем настаивать на поиске без квалификатора? Просто удалите проклятый квалификатор, не так ли? Если только у вас нет контроля над этим компонентом?

2. Давайте предположим, что у меня нет контроля над этим компонентом, что бы там ни было.

Ответ №1:

Предполагая, что вы хотите внедрить интерфейс

Если компонент квалифицирован, то вам нужно внедрить компонент через его интерфейс с его квалификатором, вот как работает CDI. Даже если вы используете Instance, вам нужно выбрать конкретную реализацию по ее квалификатору, иначе как CDI должен знать, какую реализацию вы хотите иметь? Это должно было быть указано по какой-то причине. В противном случае вы можете выполнять итерации только по всем найденным реализациям.

Предполагая, что вы можете использовать класс

Если вы можете использовать класс, а затем напрямую внедрить класс реализации, тогда вам не нужен квалификатор. Это работает, потому что класс всегда уникален, не может быть нескольких реализаций класса, это реализация, если только класс не является абстрактным.

Прочитайте этот документ, чтобы понять, как работает типобезопасное разрешение, возможно, это поможет прояснить ситуацию.

https://docs.jboss.org/weld/reference/latest/en-US/html/injection.html