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



我有一个服务接口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;
}

我尝试制作记录器实现原型,但是SCR没有像预期的那样创建记录器。这是因为工厂组件总是需要ConfigAdmin的configurationPID吗?

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

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

1)。我怎样才能做到呢?

2)。如果这是不可能的,还有其他选择吗?就像拥有其他类型的服务工厂一样,它使用组件名作为记录器名?

3)。如果这可以工作,我是否可以将目标过滤器设置为可选的,这样就不会选择随机记录器,而是使用组件名称的记录器?

目标属性是用于从OSGi service Registry选择服务的LDAP筛选器表达式。target = "(name=user)"表示服务必须有服务属性"name";值为"user"。目标属性不能用于调用带有某些参数的服务。

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

最新更新