如何使用Spring通过id获取osgi服务



此处没有弹簧。

在我的一个捆绑包中,我有一个osgi服务定义如下:

<osgi:service id="myModelInterpreter" ref="myModelInterpreterService" interface="*.IModelInterpreter" />

我知道我可以通过BundleContextgetServiceReference(向下传递IModelInterpreter.class.getName)和getService从另一个捆绑包访问它。

有没有办法通过id(myModelInterpreter)而不是使用接口(作为IModelInterpreter.class.getName传递到getServiceReference)来获得服务?

感谢您的帮助。

我不认为您可以通过在spring配置中指定的id来获得服务,因为它是spring上下文的内部设置。您可以做的是将一些服务属性添加到服务中并对其进行筛选。

像这样:

<service ref="myModelInterpreterService" interface="*.IModelInterpreter">
<service-properties>
<beans:entry key="myId" value="myModelInterpreter"/>
</service-properties>
</service>

然后在另一个捆绑包中,您可以筛选属性:

<reference id="myModelInterpreterService" interface="com.xyz.IModelInterpreter"
filter="(myId=myModelInterpreter)"/>

由于您已经在使用Spring DM来声明您的服务,因此使用它的最简单方法是使用另一个DM配置。

<osgi:reference id="modelInterpreter" interface="IModelInterpreter" />

这也可以像这样表示,以过滤到特定的Springbean。

<osgi:reference id="modelInterpreter" bean-name="myModelInterpreter" interface="IModelInterpreter" />

然后你只需使用豆子"consumer bundle中的常规Spring配置中的modelInterpreter。同样的行也可以使用bean名称来完成,但我确信它仍然需要interface或interfaces属性,因为这些是查找OSGi服务的唯一可接受的方法。使用bean名称只是在服务查找中添加属性过滤器,在大多数情况下,这是你不想要,因为它实际上在捆绑包之间创建了一个更紧密的依赖关系。例如,在没有这种紧密耦合的情况下模拟依赖关系更容易。

另一方面,如果您想在不使用DM的情况下访问服务,那么我建议您使用直接的OSGi方式,使用对注册表的直接访问(通过代码),或者使用DS(声明服务)注入它。

我会避免使用常规的Spring来直接访问OSGi服务。使用Spring只在您的bundle中进行配置,并使用SpringDM.将bundle之间的依赖关系外部化

或者只使用

Object obj = beanFactory.createBean(YourClass.class);

最新更新