我有 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
s 是手动创建的,使用new
操作符,在内部ProtocolManager
,而不是通过注释触发器,因此 - 尽管它是注释@Instantiate
,但不要参与 iPOJO 服务发布。@Provides
问题:如何正确地(最好是声明式地,使用注释)发布这个以编程方式创建的ProtocolListener
服务,而不需要手动潜入原始 OSGi 服务发布(至少在某种工厂之外,也许)?或者,可能,如何重新构建我的系统,以使其更好地配合未说出口的 iPOJO 指南?