繁体   English   中英

如何通过Spring获取ID的OSGI服务?

[英]How to get osgi service by id with Spring?

春天的菜鸟在这里。

我的一个捆绑包中定义了以下osgi服务:

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

我知道我可以从另一个包通过访问它BundleContextgetServiceReference (传承IModelInterpreter.class.getName ),然后getService

有没有一种方法可以通过id(myModelInterpreter)获得服务,而不是使用Interface(作为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" />

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

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

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

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

我将避免使用常规的Spring直接访问OSGi服务。 使用Spring仅在您的捆绑软件内进行配置,并使用Spring DM外部化捆绑软件之间的依赖关系。

或者只是使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM