此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Modulith 2.0.4spring-doc.cadn.net.cn

记录应用程序模块

通过 ApplicationModules 创建的应用模块模型可用于生成文档片段,以便嵌入到使用 Asciidoc 编写的开发者文档中。 Spring Modulith 的 Documenter 抽象可以生成两种不同类型的片段:spring-doc.cadn.net.cn

  • C4 和 UML 组件图,描述各个应用程序模块之间的关系spring-doc.cadn.net.cn

  • 所谓的应用模块画布,是关于该模块及其最关键元素(Spring Bean、聚合根、发布和监听的事件以及配置属性)的表格概览。spring-doc.cadn.net.cn

此外,Documenter 可以生成一个聚合的 Asciidoc 文件,其中包含所有现有的组件图和画布。spring-doc.cadn.net.cn

正在生成应用程序模块组件图

文档片段可以通过将 ApplicationModules 实例传递给 Documenter 来生成。spring-doc.cadn.net.cn

使用 Documenter 生成应用程序模块组件图
class DocumentationTests {

  ApplicationModules modules = ApplicationModules.of(Application.class);

  @Test
  void writeDocumentationSnippets() {

    new Documenter(modules)
      .writeModulesAsPlantUml()
      .writeIndividualModulesAsPlantUml();
  }
}
class DocumentationTests {
    private val modules = ApplicationModules.of(Application::class.java)

    @Test
    fun writeDocumentationSnippets() {
        Documenter(modules)
            .writeModulesAsPlantUml()
            .writeIndividualModulesAsPlantUml()
    }
}

Documenter 的首次调用将生成一个包含系统中所有模块的 C4 组件图。spring-doc.cadn.net.cn

All modules and their relationships rendered as C4 component diagram
图 1. 所有模块及其关系以 C4 组件图形式呈现

第二次调用将创建额外的图表,这些图表仅包含单个模块及其在画布上直接依赖的模块。spring-doc.cadn.net.cn

A subset of application modules and their relationships starting from the order module rendered as C4 component diagram
图 2. 从订单模块开始的应用程序模块子集及其关系,以 C4 组件图形式呈现

使用传统 UML 组件图

如果您更喜欢传统的 UML 风格组件图,可以调整 DiagramOptions 以使用如下风格:spring-doc.cadn.net.cn

DiagramOptions.defaults()
  .withStyle(DiagramStyle.UML);
DiagramOptions.defaults()
  .withStyle(DiagramStyle.UML)

这将导致图表显示为如下形式:spring-doc.cadn.net.cn

All modules and their relationships rendered as UML component diagram
图 3. 所有模块及其关系以 UML 组件图形式呈现
A subset of application modules and their relationships starting from the order module rendered as UML component diagram
图 4. 从订单模块开始的应用程序模块子集及其关系,以 UML 组件图形式呈现

生成应用程序模块画布

应用程序模块画布可以通过调用 Documenter.writeModuleCanvases() 生成:spring-doc.cadn.net.cn

使用 Documenter 生成应用程序模块画布
class DocumentationTests {

  ApplicationModules modules = ApplicationModules.of(Application.class);

  @Test
  void writeDocumentationSnippets() {

    new Documenter(modules)
      .writeModuleCanvases();
  }
}
class DocumentationTests {

  private val modules = ApplicationModules.of(Application::class.java)

  @Test
  fun writeDocumentationSnippets() {
    Documenter(modules)
        .writeModuleCanvases()
  }
}

默认情况下,文档将生成到构建系统的构建文件夹中的 spring-modulith-docs 文件夹。 生成的画布如下所示:spring-doc.cadn.net.cn

表 1. 应用程序模块画布示例

基础包spring-doc.cadn.net.cn

com.acme.commerce.inventoryspring-doc.cadn.net.cn

Spring 组件spring-doc.cadn.net.cn

事件监听器spring-doc.cadn.net.cn

  • c.a.c.i.InternalInventoryListeners 正在监听 o.s.m.m.DayHasPassedc.a.c.i.QuantityReducedspring-doc.cadn.net.cn

  • c.a.c.i.InventoryOrderEventListener 正在监听 c.a.c.o.OrderCanceledc.a.c.o.OrderCompletedspring-doc.cadn.net.cn

聚合根spring-doc.cadn.net.cn

已发布的事件spring-doc.cadn.net.cn

监听的事件spring-doc.cadn.net.cn

属性spring-doc.cadn.net.cn

  • acme.commerce.inventory.restock-thresholdc.a.c.c.Quantity。在库存更新期间触发 InventoryEvents.StockShort 的阈值。spring-doc.cadn.net.cn

它包含以下部分:spring-doc.cadn.net.cn

  • 应用程序模块的基础包。spring-doc.cadn.net.cn

  • 由应用模块暴露的 Spring Bean,按构造型(stereotype)分组。 — 换句话说,即位于 API 包或任何命名接口包中的 Bean。 这将检测由 jMolecules 架构抽象 定义的组件构造型,同时也包括标准的 Spring 构造型注解。spring-doc.cadn.net.cn

  • 暴露的聚合根 — 任何我们为其找到仓库或通过 jMolecules 显式声明为聚合的实体。spring-doc.cadn.net.cn

  • 模块发布的应用事件 — 这些事件类型需要使用 jMolecules @DomainEvent 进行界定,或实现其 DomainEvent 接口。spring-doc.cadn.net.cn

  • 模块监听的应用事件 — 源自使用 Spring 的 @EventListener@TransactionalEventListener,jMolecules 的 @DomainEventHandler 注解标注的方法,或实现了 ApplicationListener 接口的 Bean。spring-doc.cadn.net.cn

  • 配置属性 — 由应用模块暴露的 Spring Boot 配置属性。 需要使用 spring-boot-configuration-processor 构件来提取附加在属性上的元数据。spring-doc.cadn.net.cn

生成聚合文档

当使用 Documenter.writeDocumentation(…) 时,将生成一个 all-docs.adoc 文件,链接所有生成的图表和应用程序模块画布。 我们可以通过调用 Documenter.writeAggregatingDocument() 手动生成聚合文档:spring-doc.cadn.net.cn

使用 Documenter 生成聚合文档
class DocumentationTests {

  ApplicationModules modules = ApplicationModules.of(Application.class);

  @Test
  void writeDocumentationSnippets() {

    new Documenter(modules)
        .writeAggregatingDocument();
  }
}
class DocumentationTests {

  private val modules = ApplicationModules.of(Application::class.java)

  @Test
  fun writeDocumentationSnippets() {
    Documenter(modules)
        .writeAggregatingDocument()
  }
}

聚合文档将包含任何现有的应用程序模块组件图和应用程序模块画布。 如果不存在,则此方法不会生成输出文件。spring-doc.cadn.net.cn