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

2022-09-01 03:05:53

假设我有一个名为 、 的接口和三个实现 - 、 和 。SocialNetworkServiceTwitterServiceFacebookServiceFriendFeedService

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

@Inject private List<SocialNetworkService> socialNetworkServices;

但它不起作用(部署错误)。(也尝试了限定符 - 相同的结果)@Any

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

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


答案 1

将我的尝试与 Weld 论坛的答案相结合:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance实现 ,所以可以简单地使用 for-each 循环。需要限定符。Iterable@Any


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

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

    @Inject private Event<MessageEvent> msgEvent;
    

    并点燃它:msgEvent.fire(new MessageEvent(message));

  • 观察所有服务中的事件(无论其接口如何,这可能是一个加号):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    

答案 2

我看了一下JSR-299规范,似乎你不能轻易地做你想做的事情,而且我没有足够的Weld经验来为这种特殊情况提供代码。

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


推荐