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

Service 如何在每次调用OSGi蓝图服务时获得新的服务bean实现实例?,service,osgi,instance,blueprint,Service,Osgi,Instance,Blueprint,我有一个java类,称之为“Job”,它实现了一个接口,我使用blueprint将其导出为服务。尽管在blueprint xml文件中,该类被定义为一个带有scope=“prototype”的bean,并且服务引用该bean,但我可以从作业实例方法中的System.out.println(this)语句中看到,每次我从调用程序包访问服务时,它重用在我启动包时创建的类作业的同一个实例;我的调用程序包查找服务引用,调用context.getService(servicerences[0])以获取对作

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

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

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


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

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

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

对我来说,您似乎试图使用blueprint和prototype作用域来完成一项应该以编程方式完成的任务。您希望使用每次都创建一个新实例的服务。这意味着您应该定义JobFactory接口及其实现,并将其注册为OSGi服务。另一方面,您应该使用JobFactory来实例化任意多个作业实例


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

在我问了我的问题后,我想有人可能会这样说,“如果每次都需要一个新实例,那么你必须设计服务,让它这样做。”换句话说,如何表现取决于要实现的服务的开发人员。您的答案似乎有一些这样的主题。我目前正在考虑将作为服务导出的bean作为代理或工厂,它每次创建新实例并代表该实例调用该方法。由于其接口不允许我设置值,因此需要向作业bean中注入一些内容,因此我正在研究如何让代理对象创建新组件。关于如何实现这一点,看起来很有趣。“关于如何表现的决定取决于要实现的服务的开发人员”:是的。如果您定义一个干净的API而不使用技巧,那么您的解决方案将更容易理解。Blueprint本身充满了技巧(引用代理超时),这样做会引发很多问题,如果没有这些技巧,这些问题就不会出现。您链接的stackoverflow问题是关于原型bean作用域的。这对您来说不是一个解决方案,因为这意味着原型范围仅在一个blueprint容器内(将bean注入容器内的bean),而不是通过OSGi服务;就像链接所暗示的那样。JobProxy类实现与Job类相同的接口。JobProxy通过blueprint容器创建一个新的作业bean实例,并代表作业运行该方法。类JobProxy实现作业{public int runJob(String[]args){Job newJob=(Job)container.getComponentInstance(“Job”);返回newJob.runJob(args);}