【发布时间】:2013-02-12 13:11:42
【问题描述】:
我有 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 指南一起运行?
【问题讨论】: