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

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

@Inject private List<SocialNetworkService> socialNetworkServices;

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

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

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

有帮助吗?

解决方案

结合我的尝试和 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) {..}
    

其他提示

我看看JSR-299规范,它似乎并不认为你可以做你想轻松做什么,我没有足够的经验与焊接对于这种特殊情况下提供代码。

然而,根据章节12.3“豆发现”你也许可以申报的实现为@替代的(为了避免焊接抱怨多种实现),并听取ProcessBean事件收集SocialNetworkService的实现都看时

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top