考虑这种情况:
C2
需要{ {1}}。由于NMS正在处理许多资源,因此可能存在许多C1
和C1
的实例。因此,C2
必须绑定到其匹配的C2
。C1
,它由配置代理按资源生成,并通过其(工厂)配置属性提供给每个组件。现在,我的问题是:
问题:由于配置属性仅在组件激活后可用,因此resource-key
如何在激活之前绑定到正确的C2
,因为他们的关系?
我知道这个问题有不同的风格,并且有一些诙谐的答案,如Dynamic target queries in OSGi with DS和here。但是,所有这些答案中缺少的是这样的事实:在某些情况下,组件的每个实例的动态配置都不是先验已知,或者至少在激活之前不会。
提案:
由于我们必须解决这个问题,我能想到的唯一优雅和 OSGi可接受的答案是在引用绑定时引入动态宏扩展允许C1
:
C2
我们暂时选择坚持使用 Equinox DS (是的,我知道!)因此,我修补了他们的SCR,现在@Reference(target="(resource-key=${resource-key})")
protected void bindC1(C1 c1)
{
// some binding code
}
将绑定到通过使用C2
&#扩展 C1
,将resource-key
的{{1}}属性与C2
属性匹配的正确实例39;自己的配置。 ${resource-key-value}
内无法访问此值。
我想知道为什么我测试的所有SCR都缺少这样一个方便的设施。我在这里演示的内容可以扩展为使用除组件配置属性之外的各种来源。但为什么至少没有证据表明有关此类功能的正式提案?请赐教!
答案 0 :(得分:1)
我没有看到你需要这样的功能。由于您通过组件属性提供resource-key
,为什么不提供C1引用的目标属性C1.target
(参见DS规范中的112.6.2.1),它引用资源键值相同方式是什么?
C1.target
= (resource-key=xxx)
C1.target
组件属性的值将覆盖target
参考注释中的C1
信息。
确定值[{1}}比(resource-key=xxx)
稍微复杂一点,但这比某些宏扩展功能要容易得多。