【问题标题】:OSGI - Inject bean in new objectOSGI - 在新对象中注入 bean
【发布时间】:2016-05-26 17:34:38
【问题描述】:

我可能没有完全掌握 bean 和服务的概念,但我所有的研究都让我一无所获。

在我的 OSGI 项目中,我得到了一个提供服务的包 A(称为 myService)。

一个包 B 在一个也作为服务公开的 bean(称为 myBean)中使用此服务。

在蓝图中完成 Bean 和服务声明。

目前,bundle A 和 B 都由 Karaf 解决,接线没问题。

但是我的包 B 有另一个 bean(称为 myOtherBean),也作为服务公开,它动态创建新对象。这些对象(称为MyObject)必须在bean myBean 上有一个引用。

我怎样才能通过参考?

一种简单的方法是将引用放入我的 bean myOtherBean 并通过 MyObject 的构造函数注入它。但我想知道是否有另一种方法可以做到这一点。有人建议在MyObject 中使用@Inject 注释,但我无法使其工作。

【问题讨论】:

    标签: java dependency-injection osgi blueprint-osgi


    【解决方案1】:

    我认为在构造函数中传递服务是一个很好的方法。使用工厂是可能的,但如果您想在代码中创建对象,则很难使用蓝图工厂。 您可以通过注入蓝图上下文并手动从中检索对象来做到这一点,但这非常难看。

    【讨论】:

    • 注入蓝图上下文是我想要避免的。仅供参考,使用其他类型的依赖注入 API(如 DS)会更容易吗?
    • 我不认为这可以在 DS 中完成。为什么使用纯 java 代码创建对象会出现问题?
    • 实际上这不是问题,因为你回答了我的问题,但我只是想知道是否有任何类型的依赖注入 API 能够做到这一点
    • 大多数框架都允许某种类型的工厂,但它们通常非常有限。所以你需要java代码是很常见的。
    • 在 DS 中,您可以通过使“myOtherBean”成为原型服务工厂来实现此目的。为此,您必须使用最新的 OSGi Release 6 plus DS 1.3。
    【解决方案2】:

    听起来你有一个工厂模式并且想要将创建的 bean 注入到声明的 bean 中。正确的?

    如果是这样,请参阅:https://www.ibm.com/developerworks/library/os-osgiblueprint/

     <bean id=”accountFactory” class=“org.apache.geronimo.osgi.AccountFactory”>  
           <argument value=”account factory”/>      
       </bean>
    
       <bean id=”accountThree”
             factory-ref=“accountFactory” 
             factory-method=“createAccount”>   
           <argument value=”3”/>
           <property name=”description” value=”#3 account”/>      
       </bean>
    

    【讨论】:

    • 您的解决方案不适用于我的情况。我将以 bean 中的工厂结束,但我的问题是一样的。我不会从我的代码中获取 bean。更准确地说,我从数据库中获取了未定义数量的对象,对于这些对象中的每一个,我需要实例化另一种使用服务的对象。
    猜你喜欢
    • 2017-09-22
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多