用iPOJO发布非实例化OSGi服务



我有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的指导方针运行?

iPOJO不支持使用"new"创建对象。事实上,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)

相关内容

  • 没有找到相关文章

最新更新