为什么OSGi声明服务(DS)注释不是从超类继承的?

时间:2016-06-07 14:14:24

标签: java inheritance osgi declarative

OSGi声明服务(DS)规范定义了注释,这些注释可以由工具(如Bnd)处理到运行时使用的组件描述xml中。 R6规范中的112.8.1说:

The Component Annotations are not inherited, they can only be used on a given class, annotations on its super class hierarchy or interfaces are not taken into account.

为什么指定它们不允许继承?

1 个答案:

答案 0 :(得分:12)

Apache Felix项目提供的DS注释曾经支持DS可扩展性。基于此实现,我们尝试将其标准化为特定官方OSGi DS注释的工作的一部分。

问题是,我们在跨边界的两个实现类之间遇到了令人讨厌的耦合问题,我们无法使用Import-PackageRequire-Capability标头正确表达这种依赖关系。

有些问题浮现在脑海中:

  • 通常,您希望将bindunbind方法设为私有。 DS可以在基类上调用私有bindunbind方法吗? (从技术上讲,这可以做得很好,但概念上可以吗?)
  • 如果我们有私有方法但实现者决定更改私有方法的名称怎么办?毕竟它们是私有的,而不是API表面的一部分。扩展程序将失败,因为扩展类提供的描述符中列出了bind / unbind方法,它们仍然命名旧的方法名称。
  • 如果我们不支持私有方法名称,我们需要保护或公开这些bind / unbind方法。因此我们强制实现细节方法成为API的一部分。恕我直言不太好。
  • 注意:包私有方法不起作用,因为两个不同的包不应共享具有不同内容的相同包。

我们当时争辩说,在单个捆绑包中进行这样的继承是可以的,但得出的结论是,这种限制,围绕它的解释等等都不值得付出努力。因此,我们再次从规范路线图中删除了该功能。