我有兴趣使用OSGI作为管理项目插件的方法。那就是我的界面可以有很多实现者,每个实现者都出现在它自己/单独的OSGI包中,并且导出了实现类......
答案 0 :(得分:1)
Declarative Service应该是要走的路。
您可以将您的界面声明为service
<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的Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO将为您提供一个具体的例子。
答案 1 :(得分:1)
这可以以声明方式(如VonC)详细说明,或在运行时通过标准服务注册表动态完成。
任何实现者都可以简单地将他们的实现注册为服务,消费者可以从注册表中获取它们,这是非常基本的OSGi。这些服务也可以在属性中注册,因此消费者可以在查找服务时使用这些属性来区分实现。