假设我有一个名为SocialNetworkService
的界面和三个实现 - TwitterService
,FacebookService
和FriendFeedService
。
现在我希望,只要我的托管bean(或任何Web组件)收到消息,就可以在所有社交网络中共享它。我试过了:
@Inject private List<SocialNetworkService> socialNetworkServices;
但它没有用(部署错误)。 (还尝试了@Any
限定符 - 相同的结果)
那么,有没有办法注入接口的所有(或某些)实现的列表?
我知道给定注入点不应该有多个可能的bean的规则。我想我可以通过制作一个生成列表的生产者并使用Instance<SocialNetworkService>
来实现这一目标,但这似乎对此任务来说太多了。
答案 0 :(得分:64)
将我的尝试与Weld论坛的回答结合起来:
@Inject @Any
private Instance<SocialNetworkService> services;
Instance
实现Iterable
,因此可以简单地使用for-each循环。需要@Any
限定符。
另一种方法是使用事件系统:
MessageEvent
(包含有关该消息的所有信息)而不是注入社交网络列表,只需注入事件:
@Inject private Event<MessageEvent> msgEvent;
并解雇它:msgEvent.fire(new MessageEvent(message));
观察所有服务中的事件(无论其界面如何,这可能是一个加号):
public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
答案 1 :(得分:0)
我看了一下JSR-299规范,看起来你不能轻易做你想做的事情,而且我没有足够的经验和Weld为这个特例提供代码。
但是,根据第12.3章“Bean发现”,您可以将实现声明为@ Alternative(以避免Weld抱怨多个实现),并在看到SocialNetworkService的实现时收听要收集的ProcessBean事件。