>当我在DS中使用引用时,我可以指定一个目标,该目标将允许我缩小所需的服务实例的范围。 问题在于,所有示例都显示了必须在代码时完成的静态查询。 有没有办法执行动态查询(可能从配置管理员中提取属性)?
如果DS不支持这个,是否有另一个OSGi依赖注入框架(蓝图,iPojo等)将支持这个?
始终可以使用引用的目标属性来执行第一级筛选器。如果绑定方法具有签名
void <method-name>(<parameter-type>, Map);
然后,您可以在包含服务属性的地图上运行任何动态过滤器。如果筛选器不匹配,您可以暂时忽略该组件。
在替代方法中,由于组件的配置可以包含引用的目标筛选器,因此您可以修改组件的配置以更改目标筛选器。
我使用以下技巧。如果在服务引用上指定"target"属性,但将其值保留为空字符串,则运行时将使用具有相同名称但带有".target"后缀的组件属性。
在下面的示例中,我通过 Karaf 容器中的.cfg文件动态选择 JDBC 源代码。"datasourcefactory.target"属性会自动注入到"datasourcefactory"引用的"target"属性中。
警告:我实际上不知道这个技巧是官方支持的还是只是一个 Felix SCR 功能。我一直想在规范中查找它,看看它是否被提及...... +1 任何澄清其合法性的评论!
@Component(
name = "...",
specVersion = "1.1",
policy = ConfigurationPolicy.REQUIRE,
metatype = true
)
@Property(name = "dataSourceFactory.target",
value = "",
label = "dataSourceFactory target",
description = "An OSGi service filter to select the data source provider. "+
"For example: '(&(osgi.jdbc.driver.name=derby)(objectClass=org.osgi.service.jdbc.DataSourceFactory))' where 'derby' is the important bit and the rest is boilerplate. "+
"See DataSourceFactory.OSGI_JDBC_DRIVER_(NAME,CLASS,VERSION)."
)
@Reference(
name = "dataSourceFactory",
referenceInterface = org.osgi.service.jdbc.DataSourceFactory.class,
cardinality = ReferenceCardinality.MANDATORY_UNARY,
target = "", // must be overwritten by configuration property named "dataSourceFactory.target"
bind = "bindDataSourceFactory",
unbind = "unbindDataSourceFactory"
)