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