我创建了一个两个不同服务正在实现的接口。
考虑将接口命名为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属性来加载特定的实现。但这是静态的方式。 但为了动态地做到这一点,不能从规范和教程中联系到我应该怎么做?
答案 0 :(得分:0)
首先,您必须使LoadReference
成为@Component
,以便由SCR管理(否则@Reference
也无效)。接下来,您必须使用Configuration Admin Service为其提供配置。在此配置中,您可以通过提供名称为REFERENCE_NAME.target
:
checkReference.target = FILTER_EXPRESSION
FILTER_EXPRESSION
是OSGi过滤器中使用的标准LDAP表达式。由于属性传播,此配置属性将传播到服务组件,并在为checkReference
选择目标服务时使用。这不需要任何代码来检查LoadReference
中的条件。
答案 1 :(得分:0)