2

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2015-02-27T18:43:54.220 回答