Reference 使用Felix注释动态引用服务
我已经创建了一个接口,两个不同的服务正在实现 考虑将接口命名为CheckReference,两个不同的类CheckReferenceImpl1和CheckReferenceImpl2正在实现它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
@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