每次调用 OSGi 蓝图服务时如何获得新的服务 bean 实现实例?

How do you get a new service bean implementation instance each time you call an OSGi Blueprint service?

我有一个 java class,称之为 "Job",它实现了一个接口,我使用蓝图将其导出为服务。尽管 class 在蓝图 xml 文件中被定义为范围为 "prototype" 的 bean,并且服务引用了那个 bean,但我可以从 System.out.println(this ) 在作业的实例方法中声明,每次我从调用程序包访问服务时,它都会重用我启动包时创建的 class 作业的相同实例;我的调用程序包查找服务引用,调用 context.getService(serviceReferences[0]) 以获取对 Job 服务的引用,然后调用该服务上的方法(例如 Job.run())。

我认为每次从调用者包调用 getService 时,创建服务 bean def 原型的范围都会给我一个新的 Job 实例,但我的实验表明它仍在使用相同的对象实例。

那么我该如何调用服务并让它每次都创建一个新的 Job 实例,而不是重复使用同一个对象?

我还需要将另一个服务引用作为 属性 注入到 bean Job 中,因为 bean 接口没有设置方法来执行此操作。因此,每个新实例都必须创建为 bean Job,以便它可以使用 setX() 方法注入 属性。

如果您对 bean 使用原型作用域,则意味着每次将 bean 注入同一蓝图容器中的另一个 bean/服务时都会创建一个新实例。

在你的例子中,一个新的 bean 实例被创建,因为它被注入到服务组件中。但是,服务组件每次被另一个包请求时只能提供相同的实例。

对我来说,在我看来,您尝试使用蓝图和原型范围来完成应以编程方式完成的任务。您想要使用每次都创建一个新实例的服务。这意味着您应该定义一个 JobFactory 接口及其实现并将其注册为 OSGi 服务。另一方面,您应该使用 JobFactory 实例化任意数量的 Job 实例。

您也可以使用 PrototypeServiceFactory,但您还必须以编程方式注册它。在我看来,当有人想使用 PrototypeServiceFactory 时,是时候用工厂扩展 API。