OSGI:DS和组件工厂问题

时间:2015-07-11 08:13:51

标签: java osgi apache-felix

我需要的是每次有些消费者需要这项服务+使用CDI时获得新的服务实例。我读了很多文章,但我找不到2个问题的答案。

  1. 如果我们使用工厂,为什么在服务消费者中我们称之为工厂(https://stackoverflow.com/a/29439538/895245),之后我们就会引用服务。我的意思是

    // get factory
    ComponentFactory factory = (ComponentFactory) context.getService(serviceReferences[0]);
    // get instance
    ComponentInstance instance = factory.newInstance(null);
    
  2. 当osgi内部调用工厂时,是否无法通过特定接口和服务消费者呼叫服务设置工厂?

    1. 如果在服务消费者中我们称之为工厂,那么当事实上的工厂是组件时,为什么我们将服务标记为组件?
    2. 问题是没有工厂我会做@Inject @OsgiService(javase)或@OSGiService (javaee)而我可以使用不同的过滤器和代码非常清楚。使用组件工厂I(据我所知)松散了这种能力。

3 个答案:

答案 0 :(得分:2)

ComponentFactory存在于想要使用工厂的消费者,因为他们想要控制各个组件的生命周期。例如,如果他们想为每个Web请求创建组件的实例。

如果您不想使用ComponentFactory ...那就不要。

答案 1 :(得分:0)

  

我需要每个消费者新的组件实例。

我还没有尝试过,但根据使用 PAX-CDI OSGi v6 容器的文档,原型示波器应该做你需要的:

@OsgiServiceProvider
@PrototypeScoped
public class MyService implements SomeService{

答案 2 :(得分:0)

OSGi服务是CDI中特殊类型的bean。将它们与EJB进行比较,您可以使用CDI注入对不同类型的EJB的引用,但组件将拥有自己的生命周期。 OSGi服务也是如此;他们的生命周期不受CDI控制。 CDI只是注入对这些服务的引用。

这意味着CDI工厂不能与OSGi服务一起使用。就像你不能使用带有EJB的CDI工厂一样。实际上没有办法为每个注入点创建一个OSGi服务实例,因此也没有解决方法。

如果您需要这种模型:您必须自己创建工厂机制。