蓝图<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>
实例
答案 0 :(得分:2)
这不起作用。 DS注释由bnd处理并生成DS xml文件,然后由felix scr在运行时进行评估。在这种情况下,对象的完整生命周期是scr控制器。
如果您另外为同一个类声明蓝图bean,那么它将是一个单独的实例。 Blueprint可以将服务和bean注入此实例,但它与DS完全断开连接。
如果您主要关注的是使用annoations进行蓝图注射,那么我建议使用blueprint-maven-plugin。它允许在代码中使用CDI和Java EE注释。这些在构建时被转换为blueprint.xml。所以结果类似于DS,但是由蓝图提供支持。