osgi导出继承实现

时间:2013-06-28 19:04:21

标签: java osgi osgi-bundle

基于我在不同地方(one example)阅读的最佳实践,理想的是分离API和实现,但也只是导出API包中的包而不是实现包中的包,应该注册作为服务而已。

但是我还不清楚你应该如何扩展一个具体的课程。在我看来,能够做到

class Child extends com.foo.ParentImpl {
}

impl包需要公开com.foo

AFAIU只有两种方式

  1. 导出具体实施,但这违反了最佳做法
  2. 永远不要从不同的包中扩展类。即将所有类型层次结合在一起。在我看来,这种模式化框架的观点无法实现
  3. 那么这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以将实现类公开为导出 - OSGi不会阻止您这样做。请注意,您违反了最佳做法。

你可能会争辩说,最佳做法是打破的,在某些情况下你是对的。但是,这个确实存在是有充分理由的! Java中的继承在基类和子类之间创建了非常紧密的耦合。通过允许其他bundle可以看到您的实现类并可能将它们子类化,那么严重会限制您在基类中进行实现更改的能力。基本上,实现 API,因此将来不能更改。

所以我的建议是忘记继承。它被高估了。

如果您确实想要这样做,请按照您的选项编号2将层次结构保持在一起。

答案 1 :(得分:2)

TLDR:分离出API和实现最好留给您作为OSGI服务公开的内容,其实例将从bundle引用。否则只是按原样公开你的课程。

您在OSGI中获得的模块化类型不适合扩展Service类。你最好使用一些设计模式 允许您扩展服务的功能。

我还想知道你想要扩展什么课程,以及它的目的是什么。

现在,如果您绝对必须在服务包之外扩展服务类,那么最好的选择可能是委派。

 class MyExtendedService implements Service {
    Service service;
    //delegate to MyService which also implements Service and
    //  is pulled from another osgi bundle.
 }

现在,如果要定义类似于“事物”的类,如模型或值对象,则可能没有理由使用单独的API和实现类。只是按原样公开它们。