使用@Reference批注在运行时动态选择服务实现?

时间:2017-04-28 18:21:53

标签: java osgi apache-felix

我有一个包含@Component的osgi实现包,它获取了对服务实现的@Reference。

有多个捆绑以不同方式实现服务。没有问题osgi选择一个(使用排名或类似的东西)。问题是开发人员(I)决定使用哪种服务实现。

但是有可能以某种方式在运行时指定(当包开始时或在另一时间)@Reference注释应选择哪个服务实现?

我怀疑我可以使用ServiceTracker执行此操作。

[编辑]刚发布后我找到了https://stackoverflow.com/a/5804265/7820234(策略模式),这看起来很有希望,唯一的问题是我不知道哪些OperatorProvider服务可用。我可以实现"选择器服务"并实现ServiceTracker来管理OperatorProvider服务。

[edit2]使用ConfigurationAdmin的另一种方式似乎是https://stackoverflow.com/a/32813211/7820234,您似乎可以更改" myService.target"。扩展或实现ConfigurationAdmin的这一特定功能应该可以胜任。

哪种方式更适合或有更好的选择?

1 个答案:

答案 0 :(得分:4)

您可以尝试一种简单的解决方案。每个DS组件都可以附加到配置管理pid。使用此配置,您可以覆盖@Reference的服务过滤器。

例如,如果你有@Reference myService;,那么你可以设置配置属性“myService.target =(color = blue)。

然后,这将限制对具有服务属性color=blue的服务的引用。