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

Java 引用配置管理工厂创建的OSGi服务,java,osgi,declarative-services,Java,Osgi,Declarative Services,我读过Neil Bartlett的文章,他说DS能够取代旧的ManagedServiceFactory实例化服务的方法: 通过添加“configurationPolicy:require”,一个组件可以用作单一组件(即MS)或工厂(即MSF)。如果使用与component.name相同的工厂PID创建工厂配置,则会得到一个工厂 据我所知,使用工厂PID创建新配置会使配置管理员创建此服务的新实例;事实上,情况就是这样 假设我的工厂PID为test,然后使用felix fileinstall为tes

我读过Neil Bartlett的文章,他说DS能够取代旧的
ManagedServiceFactory
实例化服务的方法:

通过添加“configurationPolicy:require”,一个组件可以用作单一组件(即MS)或工厂(即MSF)。如果使用与component.name相同的工厂PID创建工厂配置,则会得到一个工厂

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

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

如果我这样做

@Reference(target="(service.pid=test-1)")
Test test;
这显然永远不会得到解决,因为创建的配置


如何获得对该服务的引用?我是否需要向每个配置实例添加一个附加属性以进行筛选?

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

一般来说,服务使用者应该避免对服务背后的实现了解太多,当然,导致组件实例化的PID应该被视为实现的内部细节

获取服务时,您主要关心服务的功能——这是服务接口。然后,您可能还关心服务的补充属性


例如,如果我的水管爆裂了,那么我需要一个水管工,所以我要找一个
水管工
类型的服务。如果是凌晨2点,我住在伦敦,那么我需要一个24小时的水管工,所以我添加了一个过滤器:
(&(available=24hr)(location=London))
。我还可以使用
(yelp\u rating>=4.0)
进一步优化过滤器。但我不在乎水管工的名字,也不在乎他晚餐吃了什么。

不确定是否可以让引用生效,但如果必须在代码中编写PID,这可能不是一个好迹象。我会在服务配置上创建另一个属性,并根据该属性进行过滤。谁说出我的名字并将我从睡梦中唤醒?