使用iPOJO发布非@Instantiate OSGi服务

时间:2013-02-12 13:11:42

标签: java osgi ipojo

我有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()等通用连接操作。


这里的问题是ProtocolInstance是手工创建的,new运算符在ProtocolManager内,而不是@Instantiate注释触发器,因此 - 尽管它是@Provides注释,但不参与iPOJO服务发布。


问题:如何正确地(并且最好以声明方式,带注释)发布这种以编程方式创建的ProtocolListener服务,而无需手动潜入原始OSGi服务出版物(至少在某种工厂之外,可能)?或者,可能,如何重新构建我的系统,以便更好地与未说出的iPOJO指南一起玩?

1 个答案:

答案 0 :(得分:1)

iPOJO不支持使用'new'创建对象。实际上,iPOJO实例不仅是这个对象,而且是包装它的容器。

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