【问题标题】:Osgi bundles and their relation with packagesOsgi 包及其与包的关系
【发布时间】:2021-06-17 21:17:16
【问题描述】:
对于使用 OSGi 规范编写的应用程序
服务是一个代表功能的java对象,例如录制语音通话
每个服务都有许多与之关联的包,例如服务接口、服务实现和 slick。
我无法了解上述和 OSGi 捆绑包之间的关系,因为捆绑包包含服务是否意味着它们包含服务包或其他内容
【问题讨论】:
-
欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。更详细地描述您对 OSGi 的定义以及您/它可以提供的服务存在哪些问题/误解。
标签:
java
osgi
osgi-bundle
【解决方案1】:
OSGi 服务 是bundles 的一种机制,通过所有各方都知道的定义良好的Java 接口进行通信。 OSGi 充当代理,其中一方可以在接口名称下注册服务,而其他方可以在此接口名称下获得它。 IE。实际的实现类与服务的用户分离。这允许在服务用户不知道的情况下使用不同的实现类。 IE。例如,如果您想建立一个语音呼叫,可能有一个 PhoneExchange 服务可以为您提供建立呼叫并可能记录它的功能。然后,您可以针对 PhoneExchange 接口编写代码。在运行时,您可能会与爱立信 PBX 或诺基亚 PBX 耦合。
这种解耦也存在于 Java 工厂中。然而,Java 工厂有很多缺点,而且往往是非常静态的。 OSGi 代理是一个动态 代理。服务可以注册,也可以取消注册。许多人认为 OSGi 中的活力很难处理,但声明式服务或多或少地使这变得微不足道。当您真正了解 OSGi 服务的活力时,您会发现许多复杂的动态场景(例如通信渠道)映射得非常好。
捆绑包是 OSGi 中的 模块。它包含所有 Java 代码和资源。一个包将 export 和 import Java packages。在一个设计良好的系统中,这些只是包含服务接口的Java包。导出实现包是一种不好的模式。在启动时,捆绑包是有线的。这意味着出口商受到进口商的约束。 OSGi 的独特之处在于它可以处理多个版本的同一个包。
捆绑包有自己的生命周期。他们开始和停止。在这两种情况下,他们都可以运行自己的私有代码。
上述声明式服务提供了另一层。当一个 Java 类声明它是一个带有注解的 组件 时,它还可以声明它依赖于哪些服务。当这些服务被注册时,它们被注入并且组件被激活。声明式服务允许您吃蛋糕并拥有它。您可以在没有相关复杂性的情况下获得令人难以置信的强大动态。