我有一个服务接口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日志服务有特殊的支持,但这种支持是特殊的,并不适用于任何任意的服务。