【问题标题】:Can Blueprint beans have @Reference services auto injected?蓝图 bean 可以自动注入 @Reference 服务吗?
【发布时间】:2016-03-16 12:24:02
【问题描述】:

Blueprint <bean> 标签创建的实例能否自动注入使用 OSGi 声明式服务机制指定的服务引用?

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@Component(service={})
public class DatabaseThing{
    @Reference
    public void setDataSource(DataSource ds){
    ...
    }

如果我通过@Component 中的immediate=true 进行实例化,那么我的DataSource OSGi 服务就会被注入。如果我通过蓝图<bean class="DatabaseThing"> 创建实例,则不会发生自动注入。

我查看了 Aries 源代码,似乎服务注入特定于 org.apache.aries.blueprint.container.ServiceRecipe,而不是用于 <bean> 样式实例化的 ...BeanRecipe 的一部分。

【问题讨论】:

    标签: osgi blueprint-osgi


    【解决方案1】:

    那行不通。 DS 注释由 bnd 处理并生成一个 DS xml 文件,然后由 felix scr 在运行时评估该文件。在这种情况下,对象的完整生命周期是由 scr 控制的。

    如果您另外为同一个类声明了一个蓝图 bean,那么它将是一个单独的实例。 Blueprint 可以将服务和 bean 注入此实例,但它与 DS 完全断开。

    如果您主要关心的是使用注解进行蓝图注入,那么我推荐blueprint-maven-plugin。它允许在您的代码中使用 CDI 和 Java EE 注释。这些在构建时被转换为 blueprint.xml。所以结果与 DS 类似,但由蓝图提供支持。

    【讨论】:

    • 非常感谢 Christian - 我也这么想,但感谢您的确认。 pax-cdi 注释看起来可能是我需要的 - 我只想写尽可能少的代码!
    • 您也可以查看 Aries CDI。它实现了一个新的 OSGi 规范来集成 OSGi 和 CDI。 github.com/apache/aries/tree/trunk/cdi
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2014-05-03
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多