【问题标题】:Dynamically referencing a Service using Felix annotations使用 Felix 注释动态引用服务
【发布时间】:2012-09-17 16:58:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: reference annotations osgi apache-felix


    【解决方案1】:

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

    checkReference.target = FILTER_EXPRESSION
    

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 2018-05-31
        • 1970-01-01
        • 2016-10-23
        • 2019-09-25
        • 1970-01-01
        • 2017-12-19
        相关资源
        最近更新 更多