对于最新的稳定版本,请使用 Spring Modulith 1.4.3spring-doc.cadn.net.cn

Spring Modulith 运行时支持

前面几章中描述的功能都使用了应用程序模块排列,用于验证和文档记录目的的测试场景,或者是有助于松散耦合模块但不直接使用应用程序模块结构的常规支持功能。 在本节中,我们将描述 Spring Modulith 对应用程序运行时模块初始化的支持。spring-doc.cadn.net.cn

如果要将自定义应用于此处所述的应用程序模块检测,则需要将它们移动到生产源中(除非已存在),以确保此处描述的功能会考虑这些自定义项。

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

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

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

应用程序模块初始值设定项

在使用应用程序模块时,需要在应用程序启动时执行一些特定于单个模块的代码是很常见的。 这意味着该代码的执行顺序需要遵循应用程序模块的依赖结构。 如果模块 B 依赖于模块 A,则 A 的初始化代码必须先于 B 的初始化代码运行,即使初始值设定项不直接依赖于另一个初始值设定项。spring-doc.cadn.net.cn

图

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

请注意,ApplicationModuleInitializer只有在spring-modulith-runtimeJAR 位于类路径上(请参阅 设置应用程序模块的运行时支持),因为它会提取根据应用程序模块结构对初始值设定项进行拓扑排序所需的依赖项。spring-doc.cadn.net.cn