我有一个java类,称之为“Job”,它实现了一个我使用蓝图导出为服务的接口。尽管在蓝图xml文件中将类定义为具有scope =“prototype”的bean,并且服务引用该bean,但我可以从Job的实例方法中的System.out.println(this)语句中看到,每次我从调用者包中访问服务时,它都会重用它在启动包时创建的Job类的相同实例;我的调用者包查找服务引用,调用context.getService(serviceReferences [0])来获取对Job服务的引用,然后调用该服务上的方法(例如Job.run())。
我认为每次从调用者包调用getService时,使用service bean def prototype的范围会给我一个新的Job实例,但是我的实验告诉我它仍在使用相同的对象实例。
那么我如何调用服务并让它每次都创建一个新的Job实例,而不是重用同一个对象?
我还需要将另一个服务引用作为属性注入到Bean Job中,因为bean接口没有set方法来执行此操作。因此,每个新实例都必须创建为bean作业,以便它可以使用setX()方法注入属性。
答案 0 :(得分:0)
如果对bean使用原型范围,则意味着每次将bean注入同一蓝图容器中的另一个bean /服务时,都会创建一个新实例。
在您的情况下,在将bean注入服务组件时会创建一个新的实例。但是,每次另一个bundle请求时,服务组件只能提供相同的实例。
对我而言,在我看来,您尝试使用蓝图和原型范围来完成应该以编程方式完成的任务。您希望每次都使用创建新实例的服务。这意味着您应该定义一个JobFactory接口及其实现,并将其注册为OSGi服务。另一方面,您应该使用JobFactory来实例化任意数量的Job实例。
您也可以使用PrototypeServiceFactory,但您也必须以编程方式注册它。在我看来,当有人想使用PrototypeServiceFactory时,是时候用工厂扩展API了。