OSGI Bundle 结构和与 CQ5 中其他 bundle 的通信

OSGI Bundle Structure and communication to other bundles in CQ5

根据我在使用 CQ5 进行开发时的理解,服务层将位于 OSGI 包中。这是否意味着我将创建的每项服务 类 都等同于一个 OSGI Bundle?例如,如果我的 CQ5 应用程序有 3 个服务,即:登录服务、用户管理服务、注册服务,这是否意味着还要部署 3 个 OSGI 包?这些捆绑包将如何相互通信?

不是真的。捆绑包更像是模块。因此,您可以根据服务的功能或者如果您想在其他项目中重用它们,将它们拆分成多个包。例如你可以有下一个结构:

  • projectname-core: 在那里你可以有服务,也可以被其他项目使用。像一些用于外部服务的内容提要生成器,登录服务(如果它在其他项目中也有用:
  • projectname-ui-beans:在那里你可以有 beans,你将在你的 jsp 页面上注入它;
  • projectname-services:通用服务,针对本项目,如搜索或注册;
  • projectname-taglib:你有自己的 jsp 标签实现;
  • projectname-it-test:捆绑集成测试;
  • projectname-some-specific-stuff:可以有一些服务不依赖于任何其他包,比如一次性内容操作;

参考 this 主题了解基本结构和创建它的 Maven 原型。

Upd1: bundle之间的通信有两种方式:

  • 您可以将一个包作为另一个包的依赖项。然后,您可以只使用 @Reference 从其他 bundle
  • 获取服务
  • 也可以使用事件进行交流,详见this

我认为拥有小而集中的捆绑包很好,但这并不一定意味着每个服务一个捆绑包。在您的情况下,登录、用户管理和注册看起来完全不同,可以保证它们自己的捆绑包。但是例如用户管理可能由多个服务实现,所有服务都由同一个包提供。

一个好的经验法则是设计您的捆绑包,以便删除其中一个会禁用一致的功能单元。例如,删除您的 "user management" 捆绑包会禁用所有用户管理功能,理想情况下不会影响登录或注册。

至于交流,想在服务上。使用声明式服务,OSGi 组件只需声明它们需要哪些服务(通常使用@Reference 注释),而框架只负责在所需的所有服务都可用时才启动组件。