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

Java 在运行时使用@Reference注释动态选择服务实现?,java,osgi,apache-felix,Java,Osgi,Apache Felix,我有一个osgi实现包,其中包含一个@Component,它获取对服务实现的@Reference 有多个bundle以不同的方式实现服务。没问题,osgi会选择一个(使用排名或类似的方法)。问题是开发人员(I)决定使用哪种服务实现 但是有没有可能在运行时指定@Reference注释应该选择哪个服务实现(当bundle启动时或在其他时间) 我想我可以用ServiceTracker来做这件事 [编辑]在我发布后,我发现了(策略模式),这看起来很有希望,唯一的问题是我不知道哪些运营商或供应商服务可用。

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

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

但是有没有可能在运行时指定@Reference注释应该选择哪个服务实现(当bundle启动时或在其他时间)

我想我可以用ServiceTracker来做这件事

[编辑]在我发布后,我发现了(策略模式),这看起来很有希望,唯一的问题是我不知道哪些运营商或供应商服务可用。我可以实现“选择器服务”和ServiceTracker来管理OperatorProvider服务

[edit2]另一种方法似乎是使用ConfigurationAdmin,您似乎可以更改“myService.target”。扩展或实现ConfigurationAdmin的这个特定功能应该可以完成这项工作


哪种方式是首选的,或者有更好的选择吗?

有一个简单的解决方案,您可以尝试。每个DS组件都可以连接到配置管理pid。使用此配置可以覆盖@Reference的服务筛选器

例如,如果您有
@Reference myService然后可以设置配置属性“myService.target=(color=blue)


这将限制对服务属性为
color=blue

Cheers@Christian的服务的引用,这听起来是个不错的选择。我明天将尝试实现您的解决方案。本周末时间不多,天气很好。但请注意,它是“myService.target”而不是“target.myService”“.我花了一点时间才弄明白。但它是有效的,尽管我的@Reference是动态的,但它仍然要经历@Deactivate和@Activate循环,如果这是正常的,需要做更多的研究。你可以通过将其设置为一个易失性字段来使其动态化。您可能想看看这里: