OSGi:声明性服务引用可以使用原型组件的目标过滤器吗?

OSGi: Can a declarative service reference use a target filter of a prototype component?

我有一个服务接口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 的配置 PID 吗?

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

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

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

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

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

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

DS 有 special support OSGi 日志服务,但这种支持是特殊的,并不普遍适用于任何任意服务。