Spring Modulith 运行时支持
前几章描述的功能都曾在测试场景中使用应用模块的布局进行验证和文档化,或者作为一般支持功能,帮助松散耦合模块,但并未直接与应用模块结构协作。 在本节中,我们将介绍 Spring Modulith 在应用运行时对模块初始化的支持。
| 如果你对这里描述的应用模块检测应用自定义,除非已经存在,否则你需要把这些自定义转移到你的生产源,以确保这些功能被考虑在内。 |
为应用模块设置运行时支持
要启用 Spring Modulith 的运行时支持,请确保包含Spring-模量-运行时间你的项目里的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这使得访问应用模块. -
一个
SpringBootApplicationRuntime支持前任的 Bean 以检测主应用类。 -
一个
RuntimeApplicationModuleVerifier启动时验证应用模块的排列,并在检测到违规时中止,仅在spring.modulith.runtime.verification-enabled配置为true. -
一个事件监听器
ApplicationStartedEvent将调用的应用模块初始化器在应用上下文中定义的豆子。
应用模块初始化器
在处理应用模块时,启动应用时通常需要执行针对某个特定模块的代码。 这意味着该代码的执行顺序必须遵循应用模块的依赖结构。 如果一个模B依赖于模A,那么A的初始化码必须在B的初始化码之前运行,即使初始化器不直接依赖于另一个。
当然,开发者可以通过 Spring 的标准定义执行顺序@Order注释或命令Spring Modulith 提供了应用模块初始化器用于在应用程序启动时运行的 BEANS 接口。
这些豆子的执行顺序会自动遵循应用模块的依赖结构。
-
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-模量-运行时间JAR位于类路径上(参见“设置应用模块运行时支持”),因为它会根据应用模块结构拉取初始化器所需的依赖关系,以拓扑排序初始化器。
应用模块感知飞行路径迁移
自Spring Modulith 2.0起,我们支持执行模块特定的Flyway迁移。 鼓励应用模块仅为自身的持久数据定义迁移,这意味着这些迁移必须按照模块依赖树的顺序执行。
假设默认的飞行路径设置,迁移点位于ClassPath:DB/迁移,两个应用模块第一和第二(其中第二根据第一),以及激活spring.modulith.runtime.flyway-enabled 配置属性。
有了这些,我们将根据以下方式定制飞航线设置:
-
根迁移文件夹将被更改为
数据库/迁移/中__root.为此,将使用默认的版本跟踪表。 -
其他迁移
数据库/迁移/$moduleIdentifier将注册在一个追踪表中flyway_schema_history_$moduleIdentifier. 这些迁移也设置为基线为0,迁移时也设置为基线。 -
以万用卡结尾的迁移位置不会被自定义。
注意,迁移脚本中使用的版本号现在实际上作用域限定在应用模块上,不应使用全局排序。
通过选择迁移文件的文件夹,你可以区分始终执行的迁移和只针对对应模块执行的迁移。应用模块测试集成只会执行默认迁移和测试运行中包含的模块迁移。