使用Felix注释动态引用服务

时间:2012-09-26 06:01:56

标签: reference annotations osgi apache-felix

我创建了一个两个不同服务正在实现的接口。

考虑将接口命名为CheckReference,并且正在实现两个不同的类CheckReferenceImpl1和CheckReferencImpl2。

@Component 
@Service(value = CheckReference.class) 
@Property(name = "domain", value = "ref1") 
public class CheckReferenceImpl1 implements CheckReference 

另一个,

@Component 
@Service(value = CheckReference.class) 
@Property(name = "domain", value = "ref2") 
public class CheckReferenceImpl2 implements CheckReference 

现在我想动态地使用@Reference注释动态加载实现,具体取决于我的需要。 所以,在检查条件

public class LoadReference { 
    @Reference 
    CheckReference checkReference 

    if(check) { 
      // load checkReferencImpl1 
    } else { 
       // load checkReferenceImpl2 
    } 
} 

我也知道我可以使用target属性来加载特定的实现。但这是静态的方式。 但为了动态地做到这一点,不能从规范和教程中联系到我应该怎么做?

2 个答案:

答案 0 :(得分:0)

首先,您必须使LoadReference成为@Component,以便由SCR管理(否则@Reference也无效)。接下来,您必须使用Configuration Admin Service为其提供配置。在此配置中,您可以通过提供名称为REFERENCE_NAME.target

的属性来为参考提供过滤器
checkReference.target = FILTER_EXPRESSION

FILTER_EXPRESSION是OSGi过滤器中使用的标准LDAP表达式。由于属性传播,此配置属性将传播到服务组件,并在为checkReference选择目标服务时使用。这不需要任何代码来检查LoadReference中的条件。

答案 1 :(得分:0)

你看过ComponentContext.locateService了吗?