40

假设我有一个名为 的接口,以及SocialNetworkService三个实现 -TwitterService和.FacebookServiceFriendFeedService

现在我想,每当我的托管 bean(或任何 Web 组件)收到消息时,在所有社交网络中共享它。我试过:

@Inject private List<SocialNetworkService> socialNetworkServices;

但它不起作用(部署错误)。(也尝试了@Any预选赛 - 结果相同)

那么,有没有办法注入接口的所有(或部分)实现的列表?

我知道给定注入点不应有多个可能的 bean 的规则。我想我可以通过创建一个生成列表的生产者并使用来实现这一点Instance<SocialNetworkService>,但这对于这项任务来说似乎太多了。

4

2 回答 2

70

将我的尝试与 Weld 论坛的回答结合起来:

@Inject @Any
private Instance<SocialNetworkService> services;

Instanceimplements Iterable,因此可以简单地使用 for-each 循环。@Any需要限定符。


另一种方法是使用事件系统:

  • 创建一个MessageEvent(包含有关消息的所有信息)
  • 而不是注入社交网络列表,只需注入事件:

    @Inject private Event<MessageEvent> msgEvent;
    

    并开火:msgEvent.fire(new MessageEvent(message));

  • 观察所有服务中的事件(不管它们的界面如何,这可能是一个优点):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    
于 2010-10-24T21:50:55.317 回答
0

我查看了 JSR-299 规范,您似乎无法轻松地做您想做的事情,而且我没有足够的 Weld 经验来为这种特殊情况提供代码。

但是,根据第 12.3 章“Bean Discovery”,您可能能够将实现声明为 @Alternative(以避免 Weld 抱怨多个实现)并在看到 SocialNetworkService 的实现时侦听 ProcessBean 事件以收集。

于 2010-10-24T18:18:16.423 回答