附录

附录 A: Spring Boot 兼容性

Spring Modulith 版本 Spring Boot 版本
(编译依赖版本)
Spring Boot 版本
(示例测试依赖版本)
jMolecules
(编译)
jMolecules
(测试)

1.4 (snapshot)

3.4

3.1, 3.2, 3.3, 3.4

2023.2

2023.2, 2025.0 RC2

1.3

3.4

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

1.2

3.3

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

1.1

3.2

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

附录 B: Spring Modulith 配置属性

属性 默认值 描述

spring.modulith.default-async-termination

true

是否为异步处理终止配置默认值,即等待任务完成 2 秒钟。详情请参阅 TaskExecutionProperties

spring.modulith.detection-strategy

none

应用于检测应用模块的策略。可以是自定义 ApplicationModuleDetectionStrategy 实现的类名,或者 direct-subpackages(未配置任何内容时的最终回退),或者 explicitly-annotated(仅选择使用 @ApplicationModule 或 jMolecules 的 @Module 显式注解的包)。详情请参阅自定义应用模块检测

spring.modulith.events.completion-mode

update

如何将事件发布标记为已完成。支持以下值:

  • update (默认) — 在事件发布条目上设置完成日期。

  • delete — 移除事件发布条目。已完成的事件发布无法通过 CompletedEventPublications 获取。

  • archive — 从主数据库抽象(表、集合或节点)中移除事件发布条目,并在归档中创建一份(同模式的表、集合或节点)。详情请参阅事件发布完成

spring.modulith.events.externalization.enabled

true

是否启用事件外部化。

spring.modulith.events.jdbc.schema-initialization.enabled

false

是否初始化 JDBC 事件发布模式。

spring.modulith.events.jdbc.schema

事件发布表的模式名称。如果未指定,该表将不使用模式限定。

spring.modulith.events.kafka.enable-json

true

是否为 KafkaTemplate 启用 JSON 支持。

spring.modulith.events.mongodb.transaction-management.enabled

true

是否自动为 MongoDB 启用事务。需要数据库以副本集模式运行。

spring.modulith.events.neo4j.event-index.enabled

false

是否在 Neo4j 事件发布的事件哈希属性上创建索引。

spring.modulith.events.rabbitmq.enable-json

true

是否为 RabbitTemplate 启用 JSON 支持。

spring.modulith.events.republish-outstanding-events-on-restart

false

是否在应用程序重启时重新发布未完成的事件。在多实例部署中通常不推荐此操作,因为其他实例可能仍在处理事件。

spring.modulith.moments.enableTimeMachine

false

是否启用TimeMachine

spring.modulith.moments.granularity

HOURS

发布事件的粒度。(HOURS, DAYS)

spring.modulith.moments.locale

Locale.getDefault()

确定周边界时使用的 Locale

spring.modulith.moments.zoneId

ZoneOffset.UTC

发布事件日期所在的时区。

spring.modulith.republish-outstanding-events-on-restart

false

自 1.3 版本起已弃用。请优先使用 spring.modulith.events.republish-outstanding-events-on-restart

spring.modulith.test.file-modification-detector

none

这可以是预定义值之一:uncommitted-changesreference-commitdefault,或是一个用于检查项目哪些文件已被修改的 FileModificationDetector 的完全限定类名。正如其名称所示,uncommitted-changes 只会考虑尚未提交的更改文件。reference-commit 会考虑自通过 spring.modulith.test.reference-commit 提供的给定 Git 提交以来所有更改的文件,这在 CI 环境中特别有用,该属性可以指向上次成功构建的提交哈希值。default 会检测所有未提交的更改以及尚未推送到当前分支跟踪分支的更改,这主要适用于本地开发。

spring.modulith.test.reference-commit

none

用于计算更改文件集的提交哈希值。通常在 CI 环境中传播,以考虑自上次成功构建以来的所有更改。

附录 C: Spring Modulith 模块

表 1. Spring Modulith Starter POM
Starter 典型作用域 包含

spring-modulith-starter-core

compile

  • spring-modulith-api

  • spring-modulith-apt

  • spring-modulith-moments

  • spring-modulith-core (runtime)

  • spring-modulith-runtime (runtime)

spring-modulith-starter-insight

runtime

  • spring-modulith-actuator (runtime)

  • spring-modulith-observability (runtime)

  • spring-boot-starter-actuator (runtime)

spring-modulith-starter-jdbc

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jdbc (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-jpa

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jpa (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-mongodb

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-mongodb (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-neo4j

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-neo4j (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-test

test

  • spring-modulith-docs

  • spring-modulith-test

表 2. 各个 Spring Modulith JAR
模块 典型作用域 描述

spring-modulith-actuator

runtime

一个 Spring Boot Actuator,用于通过 Actuator 暴露应用模块结构。

spring-modulith-api

compile

在生产代码中用于定制 Spring Modulith 默认行为的抽象。

spring-modulith-apt

compile

一个注解处理器,用于提取 Javadoc 以包含在应用模块 Canvas 中。

spring-modulith-core

runtime

核心应用模块模型和 API。

spring-modulith-docs

test

Documenter API,用于从模块模型创建 Asciidoctor 和 PlantUML 文档。

spring-modulith-events-amqp

runtime

对 AMQP 的事件外部化支持。

spring-modulith-events-api

runtime

用于定制 Spring Modulith 事件特性的 API。

spring-modulith-events-core

runtime

事件发布注册表的核心实现以及集成抽象 EventPublicationRegistryEventPublicationSerializer

spring-modulith-events-jackson

runtime

基于 Jackson 的 EventPublicationSerializer 实现。

spring-modulith-events-jdbc

runtime

基于 JDBC 的 EventPublicationRegistry 实现。

spring-modulith-events-jms

runtime

对 JMS 的事件外部化支持。

spring-modulith-events-jpa

runtime

基于 JPA 的 EventPublicationRegistry 实现。

spring-modulith-events-kafka

runtime

对 Kafka 的事件外部化支持。

spring-modulith-events-messaging

runtime

将事件外部化到 Spring Messaging MessageChannel 的支持。

spring-modulith-events-mongodb

runtime

基于 MongoDB 的 EventPublicationRegistry 实现。

spring-modulith-events-neo4j

runtime

基于 Neo4j 的 EventPublicationRegistry 实现。

spring-modulith-junit

test

基于应用模块结构的测试执行优化。详情请参阅此处

spring-modulith-moments

compile

此处描述的时间流逝事件实现。

spring-modulith-observability

runtime

此处描述的可观测性基础设施。

spring-modulith-runtime

runtime

支持在运行时引导 ApplicationModules 实例。通常不直接依赖,而是由 spring-modulith-actuatorspring-modulith-observability 传递依赖。

spring-modulith-test

test

集成测试支持。详情请参阅此处

附录 D: 已弃用模块

表 3. 已弃用模块表
模块 弃用版本 描述

spring-modulith-events-aws-sns

1.3

请迁移到 io.awspring.cloud:spring-cloud-aws-modulith-events-sns。详情请参阅此链接

spring-modulith-events-aws-sqs

1.3

请迁移到 io.awspring.cloud:spring-cloud-aws-modulith-events-sqs。详情请参阅此链接

附录 E: 事件发布注册表模式

基于 JDBC 的事件发布注册表支持要求数据库中存在以下数据库模式。如果您希望 Spring Modulith 为您创建模式,请将应用属性 spring.modulith.events.jdbc-schema-initialization.enabled 设置为 true

H2

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9) WITH TIME ZONE,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);

HSQLDB

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9),
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);

MariaDB

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

Microsoft SQL Server

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION')
CREATE TABLE EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE DATETIME2(6) NOT NULL,
  COMPLETION_DATE  DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

MySQL

CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

PostgreSQL

CREATE TABLE IF NOT EXISTS event_publication
(
  id               UUID NOT NULL,
  listener_id      TEXT NOT NULL,
  event_type       TEXT NOT NULL,
  serialized_event TEXT NOT NULL,
  publication_date TIMESTAMP WITH TIME ZONE NOT NULL,
  completion_date  TIMESTAMP WITH TIME ZONE,
  PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS event_publication_serialized_event_hash_idx ON event_publication USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_by_completion_date_idx ON event_publication (completion_date);

附录 F: 从 Moduliths 迁移

  • o.m.model.Modules 已重命名为 o.s.m.model.ApplicationModules

  • o.m.model.ModuleDetectionStrategy 已重命名为 o.s.m.model.ApplicationModuleDetectionStrategy

  • @o.m.test.ModuleTest 已重命名为 @o.s.m.test.ApplicationModuleTest

  • o.m.docs.Documenter.Options 已重命名为 o.s.m.docs.Documenter.DiagramOptions

  • 组件图的图表样式现在默认为 DiagramStyle.C4(通过调用 DiagramOptions.withStyle(DiagramStyle.UML) 覆盖)

  • 模块 canvas 默认隐藏非暴露类型。要在 canvas 中包含应用模块内部类型,请将 CanvasOptions 配置为 ….revealInternals()

  • 组件图和应用模块 canvas 的输出文件夹已从 moduliths-docs 移动到构建目标文件夹(例如 Maven 的 target)中的 spring-modulith-docs