Внесенный список объектов в CDI (сварной шва)
-
25-09-2019 - |
Вопрос
Скажем, у меня есть интерфейс под названием SocialNetworkService
, и три реализации - TwitterService
, FacebookService
а также FriendFeedService
.
Теперь я хочу, когда мой управляемый боб (или любой веб-компонент) получает сообщение, чтобы поделиться им во всех социальных сетях. Я старался:
@Inject private List<SocialNetworkService> socialNetworkServices;
Но это не сработало (ошибка развертывания). (Также пытался @Any
Квалификатор - тот же результат)
Итак, есть ли способ ввести список всех (или некоторых) реализаций интерфейса?
Я знаю правило, что данная точка впрыска не должна иметь более одного возможного компонента. Я думаю, я могу достичь этого, сделав производитель, который производит список и использование Instance<SocialNetworkService>
, но это кажется слишком много для этой задачи.
Решение
Объединение моих попыток с ответом с форума сварного сварного шва:
@Inject @Any
private Instance<SocialNetworkService> services;
Instance
внедрение Iterable
, Так что тогда можно просто использовать для каждого цикла. То @Any
Квалификатор необходим.
Еще один способ сделать это, используя систему событий:
- создать
MessageEvent
(Содержание всей информации о сообщении) Вместо введения списка социальных сетей, просто введите событие:
@Inject private Event<MessageEvent> msgEvent;
и огонь это:
msgEvent.fire(new MessageEvent(message));
Соблюдайте событие во всех службах (независимо от их интерфейса, который может быть плюс):
public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
Другие советы
Я посмотрел на спецификацию JSR-299, и она не кажется, что вы можете сделать то, что вы хотите легко сделать, и у меня недостаточно опыта, чтобы привести к сварению, чтобы предоставить код для этого особого случая.
Однако, основываясь на главе 12.3 «Discovery Bean», вы сможете объявить о реализациях @ @ альтернативы (чтобы избежать сварного шва возникать за несколькими реализациями) и прослушивать события процесса, чтобы собрать, когда рассматриваются реализации SocialNeworkservice.