1

春天菜鸟在这里。

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

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

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

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

任何帮助表示赞赏。

4

3 回答 3

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)"/>
于 2012-10-13T07:35:24.690 回答
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 只是在服务查找中使用属性过滤器的糖衣, 在大多数情况下你不想要它, 因为它实际上在包之间创建了更紧密的依赖关系. 它是例如,在没有如此紧密耦合的情况下更容易模拟您的依赖关系。

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

我会远离使用常规 Spring 直接访问 OSGi 服务。仅使用 Spring 在您的包中进行配置,并使用 Spring DM 将包间依赖关系外部化。

于 2012-10-12T18:56:01.523 回答
-2

或者只是使用

Object obj = beanFactory.createBean(YourClass.class);
于 2012-10-12T14:07:29.787 回答