Blueprint bean可以自动注入@Reference服务吗?

时间:2015-12-10 18:28:01

标签: osgi blueprint-osgi

蓝图<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,并且不属于用于...BeanRecipe样式的<bean>实例

1 个答案:

答案 0 :(得分:2)

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

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

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