引用Configuration Admin工厂创建的OSGi服务

时间:2019-01-06 17:31:51

标签: java osgi declarative-services

我阅读了尼尔·巴特利特(Neil Bartlett)的this answer,他说DS可以代替旧的ManagedServiceFactory实例化服务的方法:

  

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

据我所知,使用工厂PID创建新配置会使Configuration Admin创建此服务的新实例;的确是这样。

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

如果我愿意

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

作为创建的配置is required to have a generated GUID,这显然无法解决。

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

1 个答案:

答案 0 :(得分:1)

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

通常,服务使用者应该避免对服务背后的实现了解太多,并且可以肯定地将导致实例化组件的PID视为实现的内部细节。

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

例如,如果我的管道破裂了,那么我需要水管工,所以我寻找一种Plumber类型的服务。如果是凌晨2点,我住在伦敦,那么我需要24小时的水管工,所以我添加了一个过滤器:(&(available=24hr)(location=London))。我可能还使用(yelp_rating>=4.0)来完善过滤条件。但是我不在乎那个水管工的名字或他晚餐吃什么。