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'
}
值得注意的是,使用 Spring Modulith 的运行时支持意味着您将在您的应用程序中包含 ArchUnitJGraphT(拓扑排序应用程序模块所需)库。

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

  • 一个 ApplicationModulesRuntime,允许访问 ApplicationModules

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

  • 一个 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
  }
}

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