【问题标题】:How do you get a new service bean implementation instance each time you call an OSGi Blueprint service?每次调用 OSGi 蓝图服务时如何获取新的服务 bean 实现实例?
【发布时间】:2015-02-27 17:35:17
【问题描述】:

我有一个 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() 方法注入属性。

【问题讨论】:

    标签: service osgi instance blueprint


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在我提出问题后,我想有人可能会说,“如果您每次都想要一个新实例,那么您必须设计服务,让它代替它。”换句话说,行为方式的决定取决于要实现的服务的开发人员。你的回答似乎有一些主题。
    • 我目前正在考虑让作为服务导出的 bean 成为代理或工厂,它每次都会创建新实例并代表它调用该实例上的方法。由于需要向 Job bean 注入一些东西,因为它的接口不允许我设置值,我正在研究如何获取代理对象来创建新组件。 stackoverflow.com/questions/19384659/… 看起来很有趣。
    • "行为方式的决定取决于要实施的服务的开发人员":是的。如果您定义一个干净的 API 并且不使用技巧,您的解决方案将更容易理解。蓝图本身充满了技巧(引用代理超时),这样做会引发许多如果没有这些技巧就不会存在的问题。
    • 您链接的 stackoverflow 问题是关于原型 bean 范围的。这对您来说不是一个解决方案,因为它意味着原型范围仅在一个蓝图容器内(将 bean 注入容器内的 bean),而不是通过 OSGi 服务。
    • 我的解决方案(到目前为止)是创建一个 JobProxy bean,它注入蓝图容器并被服务引用;就像链接所暗示的那样。 JobProxy 类实现与 Job 类相同的接口。 JobProxy 通过蓝图容器创建一个新的 Job bean 实例并代表 Job 运行该方法。类 JobProxy 实现 Job { public int runJob(String[] args) { Job newJob = (Job)container.getComponentInstance("job");返回 newJob.runJob(args); } }
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2014-09-04
    • 2011-12-02
    • 2013-07-31
    • 2012-08-12
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多