2

我有 OSGi 模块化系统,其中有以下组件:

  • 一些特定的协议实例实现,表示通过特定协议到特定服务器的连接(每个连接服务实例化)
  • 一些特定的协议实例管理器服务,按需创建和预配置实例(通常来自不同捆绑包的多个单例服务)
  • 连接管理器,它聚合协议管理器服务并在需要时要求它们提供协议实例(单一单调服务)

它们被打包到 OSGi 包中,如下所示:

`-ConnectionManager
      `-ConnectionManager.class
`-IrcProtocol
      `-IrcProtocolManagerService.class
      `-IrcProtocolInstance.class
`-XMPPProtocol
      `-XMPPProtocolManagerService.class
      `-XMPPProtocolInstance.class

ConnectionManager注释为

@Provides
@Instantiate
@Component

并实现Subscriber接口,使其能够发送和侦听通过某种类型传递的消息Event Admin


每个*ProtocolManager都标注有

@Provides
@Instantiate
@Component

并实现ProtocolManager接口,使其能够被ConnectionManager服务侦听器发现。


每个*ProtocolInstance都标注有

@Provides
@Component

并实现Subscriber接口。它还实现了接口,该接口提供了和ProtocolInstance等通用连接操作。connect()disconnect()


这里的问题是ProtocolInstances 是手动创建的,使用new操作符,在内部ProtocolManager,而不是通过注释触发器,因此 - 尽管它是注释@Instantiate,但不要参与 iPOJO 服务发布。@Provides


问题:如何正确地(最好是声明式地,使用注释)发布这个以编程方式创建的ProtocolListener服务,而不需要手动潜入原始 OSGi 服务发布(至少在某种工厂之外,也许)?或者,可能,如何重新构建我的系统,以使其更好地配合未说出口的 iPOJO 指南?

4

1 回答 1

1

iPOJO 不支持使用“new”创建对象。事实上,一个 iPOJO 实例不仅是 this 对象,也是包装它的容器。

但是,您有两种解决方案:

于 2013-11-17T07:08:25.580 回答