【问题标题】:More than one implementator of an interface. How with OSGi?一个接口的多个实现者。 OSGi 怎么样?
【发布时间】:2010-10-21 06:45:50
【问题描述】:

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

【问题讨论】:

    标签: java osgi


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我明白了 - 但我想读取元数据,例如从捆绑包中导出的类,而不“安装”或“激活”它们......这可能吗?
    【解决方案2】:

    Declarative Service 应该是要走的路。

    您可以将您的接口声明为service

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

    该接口的每个实现都可以定义捆绑激活和停用方法。
    但真正简洁的是它们的本质:如果您使用最新的 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 问题。

    介绍: Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO,来自 EclipseCON2009,将为您提供具体示例。

    【讨论】:

    • 这个模型有一个缺点——它看起来很被动,你只能在激活后发现一个捆绑包存在。我希望能够在激活之前获得可用捆绑包及其导出类型的目录。这可能/如何?
    • 据我所知,这并不完全可能,因为要了解捆绑包,必须是跟踪器,但这意味着为时已晚,而且我无法控制激活/不活动的捆绑包。
    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2013-05-24
    • 2022-11-26
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多