iPojo实例创建和管理

时间:2015-04-20 20:04:49

标签: java osgi ipojo

由于我们忘记处理的构造实例,我目前在iPojo泄漏方面遇到了很多麻烦。我认为这是使用ipojo Factory技术进行命令式实例化的一个不可避免的缺点:基本上你通过调用factory.createComponentInstance(config)来说当你需要服务的时候,所以你有责任说你什么时候完成它。这迫使我保留两个引用,一个用于我想要使用的服务,另一个用于iPojo ComponentInstance,这样当消费者完成时,它可以调用componentInstance.dispose()。如果没有,那就是泄漏

在消费者不需要处理iPojo服务及其实例的生命周期的情况下,是否有更具声明性的方法?

为了简化我的用例,假设有一个带有按钮的UI,每次按下按钮,我都需要一个新的,独特的iPojo服务实例。理想情况下,当实例超出范围时,实例将是GC,而消费者不必做任何事情

也许我的错误是使用服务作为实例,但我有三个理由使用服务而不是普通类并调用new

  1. 服务impl应该是可替代的
  2. 消费者应该依赖于接口,而不是实现/提供者,不仅仅因为#1而且还因为根据具体的impl拉动了更多的传递依赖性
  3. 服务impl本身有一些依赖关系,我希望iPojo注入(依赖注入)。
  4. 作为第二个请求,是否有人知道使用iPojo的任何开源,真实(即非虚拟,演示)项目,我可以将其用作iPojo的良好用法示例?

1 个答案:

答案 0 :(得分:1)

您可能应该使用自定义的“创建策略”,而不是创建组件实例。因此,您将只有一个组件实例,但管理了几个“实现”实例(服务对象)。您可以决定何时创建和处置这些对象。有关http://felix.apache.org/documentation/subprojects/apache-felix-ipojo/apache-felix-ipojo-userguide/describing-components/providing-osgi-services.html#service-serving-object-creation的更多信息。

关于使用iPOJO的项目,您可以查看依赖于iPOJO的Wisdom Framework:http://wisdom-framework.org(可在此处获取代码:github.com/wisdom-framework/wisdom /)