Java 使用iPOJO发布非实例化OSGi服务

Java 使用iPOJO发布非实例化OSGi服务,java,osgi,ipojo,Java,Osgi,Ipojo,我有OSGi模块化系统,其中我有以下组件: 一些特定的协议实例实现,表示通过特定协议到特定服务器的连接(每个连接服务实例化) 一些特定的协议实例管理器服务,按需创建和预配置实例(通常来自不同捆绑包的多个单音服务) 连接管理器,聚合协议管理器服务,并要求它们在需要时提供协议实例(单音服务) 它们打包到OSGi捆绑包中,如下所示: `-ConnectionManager `-ConnectionManager.class `-IrcProtocol `-IrcProtoc

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

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

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

ConnectionManager

@Provides
@Instantiate
@Component
@Provides
@Instantiate
@Component
并实现
订阅者
接口,使其能够发送和侦听通过某种类型的
事件管理
发送的消息


每个
*ProtocolManager
都用

@Provides
@Instantiate
@Component
@Provides
@Instantiate
@Component
并实现了
ProtocolManager
接口,该接口支持通过
ConnectionManager
服务侦听器进行发现


每个
*ProtocolInstance
都用

@Provides
@Component
并实现
订户
接口。它还实现了
ProtocolInstance
接口,该接口提供了诸如
connect()
disconnect()
等通用连接操作


这里的问题是,
ProtocolInstance
是手动创建的,使用
new
操作符,在
ProtocolManager
内部,而不是通过
@实例化
注释触发器创建的,因此-不要参与iPOJO服务发布,尽管它提供了注释



问题是:如何正确地(最好是声明性地,使用注释)发布这个以编程方式创建的
ProtocolListener
服务,而不必手动深入原始OSGi服务发布(至少可能在某种工厂之外)?或者,可能是如何重新构造我的系统,以便更好地按照未说明的iPOJO准则进行操作?

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

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

  • 使用BundleContext () 注册您的对象
  • 使用Factory服务动态创建实例 ()