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'
}
新增此 JAR 將導致 Spring Boot 自動配置執行,它會在您的應用程式中註冊以下元件:
-
一個
ApplicationModulesRuntime,允許訪問ApplicationModules。 -
一個
SpringBootApplicationRuntime,用於支援前一個 Bean 以檢測主應用程式類。 -
一個
RuntimeApplicationModuleVerifier,用於在啟動時驗證應用程式模組安排,如果檢測到違規則中止,僅當spring.modulith.runtime.verification-enabled配置為true時。 -
一個用於
ApplicationStartedEvent的事件監聽器,它將呼叫在應用程式上下文中定義的ApplicationModuleInitializerbean。
應用程式模組初始化器
在使用應用程式模組時,在應用程式啟動時執行一些特定於單個模組的程式碼是很常見的。這意味著該程式碼的執行順序需要遵循應用程式模組的依賴結構。如果模組 B 依賴於模組 A,則 A 的初始化程式碼必須在 B 的初始化程式碼之前執行,即使初始化器之間沒有直接依賴關係。
雖然開發人員當然可以透過 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
}
}
請注意,ApplicationModuleInitializer bean 僅在 spring-modulith-runtime JAR 在類路徑中時才會被呼叫(請參閱設定應用程式模組的執行時支援),因為它會引入根據應用程式模組結構對初始化器進行拓撲排序所需的依賴項。
應用程式模組感知的 Flyway 遷移
從 Spring Modulith 2.0 開始,我們支援執行模組特定的 Flyway 遷移。應用程式模組被鼓勵僅為其自己的持久資料定義遷移,這意味著這些遷移必須按照模組依賴樹的順序執行。
假設一個預設的 Flyway 設定,遷移位於 classpath:db/migration,兩個應用程式模組 first 和 second(其中 second 依賴於 first),並且激活了 spring.modulith.runtime.flyway-enabled 配置屬性。
在此基礎上,我們將按如下方式自定義 Flyway 設定:
-
根遷移資料夾將更改為
db/migration/__root。為此,將使用預設版本跟蹤表。 -
將註冊
db/migration/$moduleIdentifier的其他遷移,其跟蹤表為flyway_schema_history_$moduleIdentifier。這些遷移也設定為基線版本 0,並設定為在遷移時進行基線。 -
以萬用字元結尾的遷移位置將不會被自定義。
請注意,遷移指令碼中使用的版本號現在實際上已限定在應用程式模組範圍內,不應使用全域性排序。
透過選擇放置遷移檔案的資料夾,您可以區分始終執行的遷移和僅為相應模組執行的遷移。應用程式模組測試整合將僅執行預設遷移和測試執行中包含的模組的遷移。