3

我对使用 OSGI 作为管理项目插件的一种方式很感兴趣。也就是说,我的接口可以有很多实现者,每个实现者都出现在自己/单独的 OSGI 包中,并带有导出的实现类......

4

2 回答 2

1

声明式服务应该是要走的路。

您可以将您的接口声明为服务

<service>
    <provide interface="my.Interface"/>
    <property name="foo" value="bar"
</service>

该接口的每个实现都可以定义 Bundle 激活和取消激活方法。
但真正简洁的是它们的本质:如果您使用最新的 SCR(“服务组件运行时”,它是一个“扩展包”,实现了新的和改进的 OSGi R4.2 DS - 声明式服务 - 规范),您的课程将不要从 OSGI 模型中导入任何东西。它们仍然是纯 POJO。

然后定义另一个取决于您的第一个服务的服务:

<reference name="myInterfaceServiceName"
    interface="my.Interface"
    bind="myActivationMethod" unbind="myDeactivationMethod"
    cardinality="0..n"/>

该服务将检测并列出您的第一个服务的所有具体实例,并按照您的意图处理它们。

有关更多详细信息,请参阅Eclipse Extensions and Declarative Services问题。

演示文稿: 来自 EclipseCON2009的 OSGi 中使用声明式服务、Spring 动态模块和 Apache iPOJO 的面向组件开发,将为您提供一个具体示例。

于 2009-04-23T04:39:06.277 回答
1

这可以通过详细的声明方式(如 VonC)或在运行时通过标准服务注册表动态完成。

任何实现者都可以简单地将他们的实现注册为服务,消费者可以从注册表中获取它们,这是非常基本的 OSGi 东西。服务也可以注册属性,因此消费者在查找服务时可以使用这些属性来区分实现。

于 2009-04-23T13:14:07.770 回答