让我们想象一下存在的捆绑包:
组件负责监听服务注册表中的所有“设备”服务实例。
相同的组件需要“适配器工厂”才能使用发现的设备创建“适配器”。
工厂由另一个工具包拥有。
我可以通过使用ServiceTracker(Activator + Service Tracker)解决部分问题:激活器实例化ServiceTraker,它可以注册“设备”服务中的所有更改。
但是我无法向这个服务跟踪器注入DS工厂在其他bundle中创建的,因为它将导致两个实例(一个由激活器创建,没有成员///另一个由osgi创建,并且成员变量ok但是无法听取“设备”服务的变化)。
那么......我该如何解决这个问题呢?如何以DS作为班级成员获得服务跟踪器(非常适合我)?
答案 0 :(得分:1)
使用no Activator,而是使用声明服务'activate(ComponentContext)'方法使用组件或服务(我们将其称为A)。在activate方法中,您可以像平常一样实例化ServiceTracker。
当您在A的activate方法中实例化ServiceTracker时,您还可以将AdapterFactory传递到ServiceTracker中。你可以通过从ComponentContext中取出BundleContext来获取AdapterFactory,或者(甚至更好)使用DS并使其成为A组件的服务引用。
那说:为什么你需要ServiceTracker呢?除非我误解,否则您可以使用DS绑定和取消绑定来接收有关服务可用性的事件。
编辑:使用多基数的绑定/取消绑定行为的一个(OLD)示例:http://blog.tfd.co.uk/2009/11/12/declarative-optional-multiple-references-flaky-in-osgi/
编辑:这两种方法的比较,但没有进行如此多的绑定/取消绑定:http://njbartlett.name/2010/08/05/when-servicetrackers-trump-ds.html
EDIT2:那就是说:我的一般政策是不使用Activator,除非在极少数情况下。使用DS,ipojo等,并使用您使用这些技术定义的组件,以便访问BundleContext以构建更多低级对象,如ServiceTrackers。