使用 @Reference 注释在运行时动态 select 服务实现?
Dynamically select a service implementation at runtime using @Reference annotation?
我有一个包含 @Component 的 osgi 实现包,它获取对服务实现的 @Reference。
有多个包以不同的方式实现服务。没问题 osgi 选择一个(使用排名或类似的东西)。问题是开发人员 (I) 决定使用哪个服务实现。
但是是否有可能以某种方式在运行时(当捆绑包启动时或在其他时间)指定@Reference 注释应该使用哪个服务实现select?
我怀疑我可以使用 ServiceTracker 来做到这一点。
[edit] 在我发帖后我发现 (策略模式),看起来很有希望,唯一的问题是我不知道哪些 OperatorProvider 服务可用。我可以实施 "selector service" 并实施 ServiceTracker 来管理 OperatorProvider 服务。
[edit2] 另一种方法似乎是 使用 ConfigurationAdmin,您似乎可以更改 "myService.target"。扩展或实现 ConfigurationAdmin 的这个特定功能应该可以完成这项工作。
哪个是首选方式或者是否有更好的选择?
您可以尝试一个简单的解决方案。每个 DS 组件都可以附加到一个配置管理员 pid。使用此配置,您可以覆盖@Reference 的服务过滤器。
例如,如果您有 @Reference myService;
,那么您可以设置配置 属性 "myService.target=(color=blue).
这将限制对具有服务 属性 color=blue
.
的服务的引用
我有一个包含 @Component 的 osgi 实现包,它获取对服务实现的 @Reference。
有多个包以不同的方式实现服务。没问题 osgi 选择一个(使用排名或类似的东西)。问题是开发人员 (I) 决定使用哪个服务实现。
但是是否有可能以某种方式在运行时(当捆绑包启动时或在其他时间)指定@Reference 注释应该使用哪个服务实现select?
我怀疑我可以使用 ServiceTracker 来做到这一点。
[edit] 在我发帖后我发现 (策略模式),看起来很有希望,唯一的问题是我不知道哪些 OperatorProvider 服务可用。我可以实施 "selector service" 并实施 ServiceTracker 来管理 OperatorProvider 服务。
[edit2] 另一种方法似乎是
哪个是首选方式或者是否有更好的选择?
您可以尝试一个简单的解决方案。每个 DS 组件都可以附加到一个配置管理员 pid。使用此配置,您可以覆盖@Reference 的服务过滤器。
例如,如果您有 @Reference myService;
,那么您可以设置配置 属性 "myService.target=(color=blue).
这将限制对具有服务 属性 color=blue
.