为什么 OSGi Declarative Services (DS) 注释不继承自 super 类?

Why aren't OSGi Declarative Services (DS) annotations inherited from super classes?

OSGi Declarative Services (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.

为什么指定不允许继承?

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

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

突然想到的一些问题:

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

我们当时争论说在一个包中拥有这样的继承是 ok-ish 但得出的结论是这种限制、围绕它的解释等不值得付出努力。所以我们再次从规范路线图中删除了该功能。