模块和扩展

在本节中,我们将介绍如何使用 Jmix 创建模块化和可扩展的系统。

将复杂的系统拆分为组件可以更方便管理,并支持功能的重用。例如,将用户管理功能作为单独的组件,则可以将该组件的实现和维护交给单独的团队,并可以在组织中创建的多个应用程序中进行使用,因为同一组织中对于这个功能的需求很可能都相同。

提高生产力的另一个能力是,基于现有组件,通过修改和扩展其功能而创建新的组件。还是以用户管理组件作为例子,假设在某个使用了该组件的特定应用程序中,需要为 User 实体添加一个字段。如果可以在应用程序中直接添加这种新的信息,而无需新构建一个用户管理组件的单独版本,则我们说该组件是可扩展的。

子系统、扩展组件和模块

“组件(component)” 这个词有多重含义,因此在 Jmix 模块化的上下文中,我们使用一个跟具体的术语 子系统(subsystem)。子系统是 Jmix 应用程序的一个独立组件,提供某些功能。子系统分为两类:

  • 核心子系统(Core subsystems) 提供系统级别的功能,在大多数项目中使用。

  • 扩展组件(Add-ons) 是可选的子系统,项目中根据需要引入。公共扩展组件发布在 Jmix 市场。你也可以创建自定义的扩展组件,并在组织内使用。

以下是使用核心子系统、公共报表扩展组件和自定义用户管理扩展组件应用程序的可能结构:

subsystems.drawio

我们将使用与 IDE 中相同含义的术语 module 表示模块。模块是源代码文件和构建设置的集合,用于构建并打包至单个 JAR 文件中。

一个 Jmix 子系统由一个或多个功能模块组成,每个模块都配有一个 Spring Boot starter 模块。

一个子系统可以依赖其他的子系统。例如,一个用户管理子系统很可能会依赖数据访问和 UI 子系统,而这两个子系统又依赖于核心子系统。

从技术上讲,子系统之间的依赖关系通过其功能模块之间的依赖关系表示。更多细节,请参阅 创建扩展组件 部分。

可扩展的应用程序

扩展组件(实际上,也包括子系统和核心子系统)的功能可以在应用程序或者扩展组件中进行扩展和修改。功能扩展 章节介绍可以扩展哪些方面以及如何实现。

最直接的结果是,你可以自定义应用程序中使用的扩展组件提供的某些功能,以便更好地适应你的需求。

还有一种可能是,支持创建针对特定行业或客户定制的应用程序,而无需修改原始产品。为了实现这一点,需要将主要应用程序功能放入扩展组件中,并将应用程序本身仅仅作为运行模块。

下面是可扩展应用程序的结构:

original app.drawio

如需创建应用程序的一个自定义版本,只需要将运行模块替换成包含自定义内容的运行模块:

customized app.drawio

自定义应用程序项目只包含扩展的功能,应用程序扩展组件作为依赖使用,无需修改。