前几章中描述的功能在用于验证和文档目的的测试场景中都使用了应用程序模块排列,或者是帮助松散耦合模块但不直接与应用程序模块结构一起使用的常规支持功能。 在本节中,我们将介绍Spring Modulith对应用程序运行时模块初始化的支持。
设置应用程序模块的运行时支持
要启用对 Spring Modulith 的运行时支持,请确保在项目中包含 JAR。spring-modulith-runtime
-
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
-
A 支持前一个 bean 来检测主应用程序类。
SpringBootApplicationRuntime
-
ApplicationStartedEvent
的事件侦听器,它将调用在应用程序上下文中定义的ApplicationModuleInitializer bean
。
值得注意的是,使用 Spring Modulith 的运行时支持意味着您在应用程序中同时包含 ArchUnit 和 JGraphT(需要对应用程序模块进行拓扑排序)库。 |
应用程序模块初始值设定项
使用应用程序模块时,通常需要在应用程序启动时执行一些特定于单个模块的代码。 这意味着该代码的执行顺序需要遵循应用程序模块的依赖关系结构。 如果模块 B 依赖于模块 A,则 A 的初始化代码必须在 B 的初始化代码之前运行,即使初始值设定项不直接依赖于另一个初始值设定项。
虽然开发人员当然可以通过 Spring 的标准注解或接口来定义执行顺序,但 Spring Modulith 为应用程序启动时运行的 Bean 提供了一个接口。
这些 Bean 的执行顺序将自动遵循应用程序模块依赖关系结构。@Order
Ordered
ApplicationModuleInitializer
-
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
}
}
请注意,只有当 JAR 位于类路径上时,才会调用 Bean(请参阅为应用程序模块设置运行时支持),因为这会拉入根据应用程序模块结构对初始值设定项进行拓扑排序所需的依赖关系。ApplicationModuleInitializer
spring-modulith-runtime