Spring Modulith运行时支持

前几章描述的功能都使用了应用程序模块安排,或者用于验证和文档目的的测试场景,或者是一般支持功能,有助于松散耦合模块,但未直接使用应用程序模块结构。本节我们将描述 Spring Modulith 对应用程序运行时模块初始化的支持。

如果您对此处描述的应用程序模块检测进行了自定义,则需要将其移至您的生产源代码中(除非已存在),以确保这些功能被此处描述的功能考虑。

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

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

  • Maven

  • Gradle

<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 自动配置运行,它会在您的应用程序中注册以下组件:

  • 一个 ApplicationModulesRuntime,允许访问 ApplicationModules

  • 一个 SpringBootApplicationRuntime,用于支持前一个 Bean 以检测主应用程序类。

  • 一个 RuntimeApplicationModuleVerifier,用于在启动时验证应用程序模块安排,如果检测到违规则中止,仅当 spring.modulith.runtime.verification-enabled 配置为 true 时。

  • 一个用于 ApplicationStartedEvent 的事件监听器,它将调用在应用程序上下文中定义的 ApplicationModuleInitializer bean。

应用程序模块初始化器

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

Diagram

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

  • Java

  • Kotlin

@Component
class MyInitializer implements ApplicationModuleInitializer {

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


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

请注意,ApplicationModuleInitializer bean 仅在 spring-modulith-runtime JAR 在类路径中时才会被调用(请参阅设置应用程序模块的运行时支持),因为它会引入根据应用程序模块结构对初始化器进行拓扑排序所需的依赖项。

应用程序模块感知的 Flyway 迁移

从 Spring Modulith 2.0 开始,我们支持执行模块特定的 Flyway 迁移。应用程序模块被鼓励仅为其自己的持久数据定义迁移,这意味着这些迁移必须按照模块依赖树的顺序执行。

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

在此基础上,我们将按如下方式自定义 Flyway 设置:

  • 根迁移文件夹将更改为 db/migration/__root。为此,将使用默认版本跟踪表。

  • 将注册 db/migration/$moduleIdentifier 的其他迁移,其跟踪表为 flyway_schema_history_$moduleIdentifier。这些迁移也设置为基线版本 0,并设置为在迁移时进行基线。

  • 以通配符结尾的迁移位置将不会被自定义。

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

通过选择放置迁移文件的文件夹,您可以区分始终运行的迁移和仅为相应模块执行的迁移。应用程序模块测试集成将仅执行默认迁移和测试运行中包含的模块的迁移。

© . This site is unofficial and not affiliated with VMware.