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

Referencing a Configuration Admin factory-created OSGi service

我阅读了 Neil Bartlett 的 this answer,其中指出 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 创建新配置会使配置管理员创建此服务的新实例;确实是这样。

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

如果我这样做

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

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

如何获得对该服务的引用?我是否需要向每个配置实例添加额外的 属性 以作为过滤依据?

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

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

在获取服务的时候,你最关心的是服务做什么——这就是服务接口。那么您可能还关心服务的补充属性。

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