我有一个包含@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的这一特定功能应该可以胜任。
哪种方式更适合或有更好的选择?
答案 0 :(得分:4)
您可以尝试一种简单的解决方案。每个DS组件都可以附加到配置管理pid。使用此配置,您可以覆盖@Reference的服务过滤器。
例如,如果你有@Reference myService;
,那么你可以设置配置属性“myService.target =(color = blue)。
然后,这将限制对具有服务属性color=blue
的服务的引用。