2015-11-03 41 views

回答

1

tl; dr:你几乎肯定不想使用ComponentFactory,所以我建议忽略它。

在我解释服务工厂之前,重要的是要明白,OSGi中的大多数服务在概念上是单例。当你注册一个服务时,你将一个Java对象放入注册表中,并且该对象必须实现它已经注册的接口。当客户查找你的服务(使用它的接口)时,他们都会得到同样的对象。

使用服务工厂,您可以注册一个创建实现该接口的对象的工厂。 OSGi使用这个工厂创建一个新的实例,每个消费包使用。这很有用,因为您现在可以为每个消费包提供一个稍微不同的对象。例如,如果您正在实施日志记录服务,则使用服务工厂可以让您跟踪哪些软件包正在调用日志。

但是,服务工厂对消费者完全透明。它只是以正常的方式使用服务。这很好,但有时消费者需要程序控制,即消费者决定何时应该创建服务对象以及何时应该销毁服务对象。这不适用于服务工厂。

部件工厂是提供这种程序控制的早期尝试。我认为它们已经过时了。它们不易使用,因为您必须将提供者和使用者都与Declarative Services API耦合。

现在你应该使用prototype作用域的服务,在OSGi的版本6中引入的,我在博客这些here

+0

你的意思是说组件工厂是一个早期尝试提供这种编程控制。这是通过组件工厂达成还是仍然公开?问题是我们没有使用最新的osgi版本。所以我们不能使用OSGi Release 6中提到的示波器 – Shriram

+0

我不明白你的问题,你可以重新翻译一下吗?您是否确实需要消费者通过服务对象进行程序控制?这在实践中很少需要。 –

+0

我的要求是为组件创建组件工厂。我问过你的问题来自你发布的答案。 ie)是否通过组件工厂进行编程控制?编写组件工厂时还有一件事(工厂=“xxxx”),我使用'@service'和'@component'。工厂实施中@serivce的需求是什么? – Shriram