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

Can Blueprint beans have @Reference services auto injected?

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 的一部分]样式实例化。

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

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

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