Java 引用配置管理工厂创建的OSGi服务
我读过Neil Bartlett的文章,他说DS能够取代旧的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
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,这可能不是一个好迹象。我会在服务配置上创建另一个属性,并根据该属性进行过滤。谁说出我的名字并将我从睡梦中唤醒?