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

Spring Modulith 运行时支持

前几章描述的功能要么用于测试场景以进行验证和文档编写,要么是通用的支持功能,旨在帮助模块间松耦合,但并未直接与应用模块结构协同工作。 在本节中,我们将介绍 Spring Modulith 对应用运行时模块初始化的支持。spring-doc.cadn.net.cn

如果您正在对此处描述的应用模块检测应用自定义配置,则需要将这些配置移至您的生产源代码中(如果尚未存在),以确保此处描述的功能能够考虑到这些配置。

为应用程序模块设置运行时支持

要启用 Spring Modulith 的运行时支持,请确保在项目中包含 spring-modulith-runtime JAR。spring-doc.cadn.net.cn

<dependency>
  <groupId>org.springframework.modulith</groupId>
  <artifactId>spring-modulith-runtime</artifactId>
  <scope>runtime</scope>
</dependency>
dependencies {
  runtimeOnly 'org.springframework.modulith:spring-modulith-runtime'
}

添加此 JAR 将导致 Spring Boot 自动配置运行,从而在您的应用程序中注册以下组件:spring-doc.cadn.net.cn

应用程序模块初始化器

在使用应用模块时,很常见的需求是在应用启动时执行特定于某个模块的代码。 这意味着该代码的执行顺序需要遵循应用模块的依赖结构。 如果模块 B 依赖于模块 A,那么 A 的初始化代码必须在 B 之前运行,即使这些初始化器之间没有直接的依赖关系。spring-doc.cadn.net.cn

Diagram

虽然开发人员当然可以通过 Spring 标准的 @Order 注解或 Ordered 接口来定义执行顺序,但 Spring Modulith 提供了一个 ApplicationModuleInitializer 接口,用于在应用程序启动时运行 Bean。 这些 Bean 的执行顺序将自动遵循应用程序模块的依赖结构。spring-doc.cadn.net.cn

@Component
class MyInitializer implements ApplicationModuleInitializer {

  @Override
  public void initialize() {
    // Initialization code goes here
  }
}
@Component
class MyInitializer : ApplicationModuleInitializer {


  override fun initialize() {
    // Initialization code goes here
  }
}

请注意,只有当 spring-modulith-runtime JAR 位于类路径上时(参见 为应用程序模块设置运行时支持),才会调用 ApplicationModuleInitializer bean,因为它会引入所需的依赖项,以便根据应用程序模块结构对初始化器进行拓扑排序。spring-doc.cadn.net.cn

应用模块感知的 Flyway 迁移

自 Spring Modulith 2.0 起,我们支持执行模块特定的 Flyway 迁移。 鼓励应用模块仅为其自身的持久化数据定义迁移,这意味着这些迁移必须按照模块依赖树的顺序执行。spring-doc.cadn.net.cn

假设有一个默认的 Flyway 设置,迁移脚本位于 classpath:db/migration,有两个应用模块 firstsecond(其中 second 依赖于 first),并且激活了 spring.modulith.runtime.flyway-enabled 配置属性spring-doc.cadn.net.cn

在此基础上,我们将按以下方式自定义 Flyway 配置:spring-doc.cadn.net.cn

  • 根迁移文件夹将更改为db/migration/__root。为此,将使用默认的版本跟踪表。spring-doc.cadn.net.cn

  • db/migration/$moduleIdentifier 的额外迁移将注册到跟踪表 flyway_schema_history_$moduleIdentifier 中。 这些迁移也会设置为基线版本 0,并在执行迁移时设置为基线。spring-doc.cadn.net.cn

  • 以通配符结尾的迁移位置将不会被自定义。spring-doc.cadn.net.cn

注意,迁移脚本中使用的版本号现在实际上已限定在应用程序模块范围内,不应使用全局排序。spring-doc.cadn.net.cn

通过选择存放迁移文件的文件夹,您可以区分始终要运行的迁移与仅针对相应模块执行的迁移。应用程序模块测试集成将仅执行默认迁移以及测试运行中包含的模块对应的迁移。spring-doc.cadn.net.cn