Spring Modulith Runtime Support

前几章所述的功能都使用了应用程序模块的排列,用于用于验证和文档目的的测试场景或通用支持功能,这些功能有助于将模块松散耦合,但不会直接与应用程序模块结构配合使用。本节我们将介绍 Spring Modulith 对应用程序运行时模块初始化的支持。

Setting up Runtime Support for Application Modules

若要为 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'
}

值得注意的是,使用 Spring Modulith 的运行时支持意味着您要在应用程序中包含 ArchUnit 和必需的 JGraphT (用于对应用程序模块进行拓扑排序)库。

添加此 JAR 将导致 Spring Boot 自动配置运行,该配置将以下组件注册到你的应用程序中:

  • 一个 ApplicationModulesRuntime,允许访问 ApplicationModules

  • 一个 `SpringBootApplicationRuntime`来支持前一个 bean,以检测主应用程序类。

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

Application Module Initializers

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

hide empty members

package org.springframework.modulith { interface ApplicationModuleInitializer }

package com.acme.moduleA { class InitializerA implements ApplicationModuleInitializer

  class ComponentA
}

package com.acme.moduleB {

class ComponentB
  class InitializerB implements ApplicationModuleInitializer
}

ComponentB -→ ComponentA

虽然开发人员当然可以通过 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
  }
}

请注意,只有当 spring-modulith-runtime JAR 在类路径中时, ApplicationModuleInitializer Bean 才会被调用(参见 Setting up Runtime Support for Application Modules),因为它会提取对根据应用程序模块结构对初始化器进行拓扑排序所需的依赖项。