在CDI中注入对象列表(焊接)

时间:2010-10-24 17:19:02

标签: java cdi jboss-weld

假设我有一个名为SocialNetworkService的界面和三个实现 - TwitterServiceFacebookServiceFriendFeedService

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

@Inject private List<SocialNetworkService> socialNetworkServices;

但它没有用(部署错误)。 (还尝试了@Any限定符 - 相同的结果)

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

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

2 个答案:

答案 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事件。