我有OSGi模块化系统,其中有以下组件:
- 一些特定的协议实例实现,表示通过特定协议到特定服务器的连接(按连接服务实例化)
- 一些特定的协议实例管理器服务,根据需要创建和预配置实例(通常来自不同捆绑包的多个singletone服务)
- 连接管理器,它聚合协议管理器服务,并要求它们在需要时提供协议实例(单个单点服务)
它们被打包到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
是在ProtocolManager
内部使用new
运算符手动创建的,而不是通过@Instantiate
注释触发器创建的,因此,尽管它是@Provides
注释,但不要参与iPOJO服务发布。
问题是:如何正确地(最好是声明性地,带有注释)发布这个以编程方式创建的ProtocolListener
服务,而不需要手动进入原始OSGi服务发布(至少可能是在某种工厂之外)?或者,可能是,如何重新构建我的系统,以便更好地按照iPOJO的指导方针运行?
然而,您有两个解决方案:
- 使用BundleContext(http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-faq.html#injecting-pojo中的内容)注册您的对象
- 使用Factory服务动态创建实例(http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/ipojo-advanced-topics/ipojo-factory-service.html)