题
假设我有一个名为 SocialNetworkService
, ,以及三个实现 - TwitterService
, FacebookService
和 FriendFeedService
.
现在我希望,每当我的托管 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的实现都看时
不隶属于 StackOverflow