Как программно внедрить компонент CDI по имени класса - PullRequest
0 голосов
/ 25 апреля 2019

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

Можно ли это сделать в CDI?

1 Ответ

0 голосов
/ 03 мая 2019

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

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

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

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

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

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

...