【问题标题】:OSGi: Can a declarative service reference use a target filter of a prototype component?OSGi:声明式服务引用可以使用原型组件的目标过滤器吗?
【发布时间】:2021-12-02 03:25:22
【问题描述】:

我有一个服务接口Logger和一个服务工厂

interface LoggerFactory {
    Logger createLogger(String name)
}

我的组件是这样使用它的:

@Component
public class User {
    
    private Logger logger;

    @Activate
    public User(@Reference LoggerFactory loggerFactory) {
        logger = loggerFactory.create("user")
    }
}

我想摆脱LoggerFactory,而是能够像这样检索我的记录器:

@Component
public class User {
    
    @Reference(target = "(name=user)")
    private Logger logger;

}

我尝试制作 Logger 实现原型,但 SCR 没有按预期创建记录器。是不是因为工厂组件总是需要来自 ConfigAdmin 的 configurationPID?

我还尝试通过捆绑上下文显式为 Logger 接口注册 PrototypeServiceFactory,但没有成功。

我的印象是这必须以某种方式与声明式服务一起工作,因为另一个用例适合这种模式,所以这似乎是一个常见问题:许多组件使用 http 服务但端口不同。我想使用目标过滤器作为参考,而不是我的自定义工厂。

1.) 我怎样才能做到这一点?

2.) 如果这不可能,是否有替代方案?就像拥有其他类型的服务工厂一样,它使用组件名称作为记录器名称?

3.) 如果这能以某种方式工作,我可以将目标过滤器设为可选,这样它就不会选择随机记录器,而是选择使用组件名称的记录器?

【问题讨论】:

    标签: osgi declarative-services


    【解决方案1】:

    目标属性是一个 LDAP 过滤器表达式,用于从 OSGi 服务注册表中选择一个服务。 target = "(name=user)" 表示服务必须具有值为“user”的服务属性“name”。目标属性不能用于调用带有某些参数的服务。

    DS 为 OSGi 日志服务提供 special support,但该支持是特殊的,通常不适用于任何任意服务。

    【讨论】:

      猜你喜欢
      • 2014-02-05
      • 2012-04-27
      • 2011-05-27
      • 2013-10-27
      • 2015-12-23
      • 2010-09-23
      • 2018-11-05
      • 1970-01-01
      • 2012-10-01
      相关资源
      最近更新 更多