如何用Spring获取id的osgi服务?

时间:2012-10-12 13:46:57

标签: java spring osgi spring-dm

春天的菜鸟。

我的一个osgi服务在我的一个bundle中定义如下:

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

我知道我可以通过BundleContext getServiceReference {传递IModelInterpreter.class.getName)然后getService从另一个捆绑中访问它。

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

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

我认为你不能通过你在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)"/>

答案 1 :(得分:1)

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

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

这也可以像这样表示过滤到特定的Spring bean。

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

然后你只需在使用者服务器包中的常规Spring配置中使用bean“modelInterpreter。同样的行也可以使用bean-name来完成,但我很确定它仍然需要interface或interfaces属性,因为这些是查找OSGi服务的唯一可接受的方法。使用bean-name简单地在服务查找中使用属性过滤器,在大多数情况下你不需要,因为它实际上在bundle之间创建了更紧密的依赖例如,如果没有这种紧密耦合,就可以更容易地模拟你的依赖。

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

我会远离使用常规Spring来直接访问OSGi服务。使用Spring仅在bundle中进行配置,并使用Spring DM外部化interbundle依赖项。

答案 2 :(得分:-2)

或者只是使用

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