Reference 使用Felix注释动态引用服务

Reference 使用Felix注释动态引用服务,reference,annotations,osgi,apache-felix,Reference,Annotations,Osgi,Apache Felix,我已经创建了一个接口,两个不同的服务正在实现 考虑将接口命名为CheckReference,两个不同的类CheckReferenceImpl1和CheckReferenceImpl2正在实现它 @Component @Service(value = CheckReference.class) @Property(name = "domain", value = "ref1") public class CheckReferenceImpl1 implements CheckReferenc

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

考虑将接口命名为CheckReference,两个不同的类CheckReferenceImpl1和CheckReferenceImpl2正在实现它

@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属性来加载特定的实现。但这是静态的方式。 但是为了动态地做到这一点,不能从规范和教程中联系起来,我应该怎么做

首先,您必须将LoadReference设置为@Component,以便它由SCR管理,否则@Reference也无法工作。接下来,您必须使用configuration Admin服务为其提供配置。在此配置中,您可以通过提供名为reference_name.target的属性来为引用提供筛选器:

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

您看过吗

checkReference.target = FILTER_EXPRESSION