OSGI:DS 和组件工厂问题

OSGI: DS and component factories issues

我需要的是每次当一些消费者需要此服务+使用CDI时获取新的服务实例。我已经阅读了很多文章,但找不到 2 个问题的答案。

  1. 如果我们使用工厂,为什么在服务消费者中我们调用工厂(http://www.rpgnextgen.com/wiki/doku.php?id=component_factory),然后我们获得对服务的引用。我是说

    // get factory
    ComponentFactory factory = (ComponentFactory) context.getService(serviceReferences[0]);
    // get instance
    ComponentInstance instance = factory.newInstance(null);
    

有没有办法设置工厂有一定的接口,在osgi里面调用工厂的时候服务消费者调用服务?

  1. 如果在服务消费者中我们调用工厂那么为什么我们将服务标记为组件而事实上的工厂是组件?

问题是,如果没有工厂,我会执行 @Inject @OsgiService (javase) 或@OSGiService (javaee) 并且我可以使用不同的过滤器并且代码非常清晰。使用组件工厂我(据我所知)失去了这种能力。

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

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

I need for every consumer new instance of component.

我还没有尝试过,但是根据使用 PAX-CDIOSGi v6 容器时的文档,然后是原型范围应该做你需要的:

@OsgiServiceProvider
@PrototypeScoped
public class MyService implements SomeService{

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

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

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