由于我们忘记处理构建的实例,我目前在iPojo泄漏方面遇到了很多问题。我认为这是使用ipojo Factory技术使用命令式实例化的一个不可避免的缺点:基本上,你可以通过调用factory.createComponentInstance(config)
来说明何时需要服务,所以你有责任说明何时完成。这迫使我保留两个引用,一个是我想使用的服务,另一个是ipojoComponentInstance
,这样当消费者完成时,它可以调用CCD_ 3。如果没有,则泄漏
在消费者不需要处理iPojo服务及其实例的生命周期的情况下,是否有更具声明性的方法来做到这一点
为了简化我的用例,假设有一个UI,里面有一个按钮,每次按下按钮,我都需要一个新的、唯一的iPojo服务实例。理想情况下,当实例超出范围时,它将是GC’d,而消费者不必做任何
也许我的错误是使用服务作为实例,但我有三个理由使用服务而不是普通类并调用new
。
- 服务impl应该是可替代的
- 使用者应该依赖于接口,而不是实现/提供者,这不仅是因为#1,还因为在依赖于具体impl时会产生更多的可传递依赖关系
- 服务impl本身有一些依赖项,我希望iPojo会注入这些依赖项(依赖项注入)
作为第二个请求,有人知道任何使用iPojo的开源、真实(即非虚拟、演示)项目吗?
您可能应该使用自定义的"创建策略",而不是创建组件实例。因此,您将只有一个组件实例,但要管理多个"实现"实例(服务对象)。您可以决定何时创建和处置这些对象。有关的更多信息http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/providing-osgi-services.html#service-服务对象创建。
关于一个使用iPOJO的项目,你可以看看智慧框架,它依赖于iPOJO:http://wisdom-framework.org(代码:github.com/wishframework/withive/)