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

BJ *_*ave 11 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.

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

小智 12

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

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

一些问题浮现在脑海:

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

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