java - 引用配置管理工厂创建的 OSGi 服务

标签 java osgi declarative-services

我读到this answer Neil Bartlett 指出 DS 能够取代实例化服务的旧 ManagedServiceFactory 方法:

A component can be used as either a singleton (i.e. MS) or a factory (i.e. MSF) by adding "configurationPolicy: require". If you create a factory config with a Factory PID the same as the component.name, then you get a factory.

据我所知,使用工厂 PID 创建新配置会使配置管理员创建此服务的新实例;事实上,这就是发生的事情。

假设我的工厂 PID 为 test,然后我使用 felix-fileinstall 添加 test-1 的配置。当我添加相应的配置时,该服务就会正确实例化并激活。

如果我这样做

@Reference(target="(service.pid=test-1)")
Test test;

这显然永远不会得到解决,因为创建的配置 is required to have a generated GUID .

如何获得对此服务的引用?我是否需要向每个配置实例添加一个附加属性来进行过滤?

最佳答案

为什么需要获取对此特定服务实例的引用?

通常,服务使用者应避免过多了解服务背后的实现,当然,导致组件实例化的 PID 应被视为实现的内部细节。

当获取服务时,您主要关心该服务做什么——这就是服务接口(interface)。那么您可能还关心服务的补充属性。

例如,如果我的管道爆裂,那么我需要一名水管工,因此我会寻找水管工类型的服务。如果现在是凌晨 2 点,并且我住在伦敦,那么我需要一名 24 小时管道工,因此我添加了一个过滤器:(&(available=24hr)(location=London))。我还可以使用 (yelp_ rating>=4.0) 优化过滤器。但我不会关心水管工的名字或他晚餐吃什么。

关于java - 引用配置管理工厂创建的 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064151/

相关文章:

java - 使用 XML 解析器实现作为 OSGi 服务

java - 仅在重新启动后 Karaf 中出现 ClassCastException

java - 在 OSGi DS 中,如何在引用服务的属性更新时收到通知?

java - Android 添加应用程序到 "Set as"或 "Set picture as"选项列表

java - 测量 Java 应用程序中的 sql 执行时间

java - Scriptella:如何从 clob 对象动态获取数据,然后将其插入数据库?

Java swing 组件在 netbeans 之外无法正确显示

java - 使用 Felix & Maven 创建一个完整的 OSGi 应用程序

osgi - 带有 RSA 和 DS 的 Apache CXF ContainerRequestFilter

java - OSGi 中的回调和传递对象引用