1

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

考虑接口被命名为 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 
    } 
} 

我也知道我可以使用目标属性来加载特定的实现。但那是静态的方式。但是为了动态地做到这一点,无法与规范和教程联系起来,我应该怎么做?

4

2 回答 2

0

你看过ComponentContext.locateService吗?

于 2012-09-26T10:41:17.540 回答
0

首先,您必须创建LoadReference一个@Component, 以便它由 SCR 管理(否则@Reference也不起作用)。接下来,您必须使用配置管理服务为其提供配置。在此配置中,您可以通过提供具有 name 的属性来为引用提供过滤器REFERENCE_NAME.target

checkReference.target = FILTER_EXPRESSION

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

于 2012-09-26T07:43:00.197 回答