Spring Modulith 1.3 有哪些新功能?

banq發表於2024-11-23

關於Spring Modulith 1.3版本的新特性介紹。以下是該版本的主要更新內容:

1、基線升級:
Spring Modulith 1.3升級到了Spring Boot 3.4和Spring Framework 6.2的最新版本,同時保持與之前版本的相容性,允許使用者選擇性升級到Spring Modulith 1.3而不必升級到最新的Boot和Framework版本。

2、應用模組模型:

  • 支援巢狀應用模組,這些模組對同級模組隱藏,增加了應用結構的靈活性。
  • 透過在模組的基礎包內巢狀的包上使用@ApplicationModule(或jMolecules的@Module)來宣告巢狀應用模組。

 Example
└─ src/main/java
   |
   ├─ example
   |  └─ Application.java
   |
   |  -> Inventory
   |
   ├─ example.inventory
   |  ├─ InventoryManagement.java
   |  └─ SomethingInventoryInternal.java
   ├─ example.inventory.internal
   |  └─ SomethingInventoryInternal.java
   |
   |  -> Inventory > Nested
   |
   ├─ example.inventory.nested
   |  ├─ ☕ package-info.java <font>// @ApplicationModule<i>
   |  └─ NestedApi.java
   ├─ example.inventory.nested.internal
   |  └─ NestedInternal.java
   |
   |  -> Order
   |
   └─ example.order
      ├─ OrderManagement.java
      └─ SomethingOrderInternal.java


包上的註釋導致其反過來成為巢狀的應用程式模組。在該安排中,適用以下訪問規則:@ApplicationModulenested

  • Nested中(
    example.inventory.nested
    )的程式碼僅可從Inventory或巢狀在Inventory內的兄弟應用程式模組公開的任何型別中獲得。
  • 巢狀模組中的任何程式碼都可以訪問父模組中的程式碼,甚至是內部程式碼。即和都NestedApi可以NestedInternal訪問inventory.internal.SomethingInventoryInternal。
  • 巢狀模組中的程式碼還可以透過頂級應用程式模組訪問公開的型別。

nested(或任何子包)中的任何程式碼都可以訪問OrderManagement。


3、外部應用模組:

  • 在 1.3 版中,引入了SPI ApplicationModuleSourceFactory,可以透過META-INF/spring.factories註冊,用於宣告根包掃描、顯式應用模組基礎包,並可選地自定義應用模組檢測策略。

package example;

public class CustomApplicationModuleSourceFactory implements ApplicationModuleSourceFactory {

  @Override
  public List<String> getRootPackages() {
    return List.of(<font>"com.acme.toscan");
  }

  @Override
  public ApplicationModuleDetectionStrategy getApplicationModuleDetectionStrategy() {
    return ApplicationModuleDetectionStrategy.explicitlyAnnotated();
  }

  @Override
  public List<String> getModuleBasePackages() {
    return List.of(
"com.acme.module");
  }
}

上述示例將使用 com.acme.toscan 來檢測其中明確宣告的模組,並從 com.acme.module 中建立應用模組。 由此返回的包名隨後將透過 ApplicationModuleDetectionStrategy 中暴露的相應 getApplicationModuleSource(...) 函式轉換為 ApplicationModuleSources。

4、整合測試:
最佳化整合測試的執行一直是 Spring Modulith 的核心功能。應用程式模組可以單獨引導,也可以使用@ApplicationModuleTest註釋以不同程度的協作進行引導。

  • @ApplicationModuleTest註解現在支援透過其新引入的module屬性顯式定義要執行的模組。
  • 引入了JUnit Jupiter擴充套件,分析應用變更並僅執行真正需要執行的整合測試。

5、事件釋出登錄檔:
引入了兩種新的完成模式:delete和archive,分別用於刪除和歸檔事件釋出。

  1. 第一種新的完成模式 ( delete) 立即刪除釋出,而不是設定完成日期。這意味著登錄檔中的條目數量保持較小,因此在釋出大量事件的系統中產生的效能開銷較小。
  2. 完成後立即刪除釋出內容的缺點是無法訪問它們,例如出於統計目的。這就是為什麼我們還新增了存檔 ( archive) 模式,該模式維護一個專用的釋出存檔,已完成的釋出內容將移至該存檔。這在事件釋出上產生了相同的效能改進,但單獨保留了已完成的釋出內容。

按識別符號完成事件釋出:

  • 支援透過識別符號完成事件釋出,提高了效能。

到目前為止,事件釋出是透過修飾事務應用程式偵聽器來完成的。這意味著完成程式碼只能訪問使用的原始應用程式事件和偵聽器的識別符號,而不能訪問單個釋出的識別符號。

在 Spring Modulith 1.3 中,事件釋出登錄檔會跟蹤當前正在進行的事件釋出,因此我們可以根據釋出的識別符號釋出釋出完成。這允許各個後備儲存實現顯著提高完成操作的效能,因為可以更有效地使用索引。

支援更多關聯式資料庫和資料表結構:包括MariaDB、Oracle DB和Microsoft SQL Server。

事件外部化

  • 事件外部化支援增加了訊息頭和動態路由目標的SpEL表示式。
  • 支援將事件寫入Spring的MessageChannel抽象。

Spring Modulith 支援將應用程式事件輕鬆外部化到其他系統中,同時還提供了許多新功能。 傳送出去的訊息現在可以獲得與之相關的頭資訊。 為此,EventExternalizingConfiguration 現在提供了各種 headers(...) 方法,允許為一般事件或特定事件型別註冊自定義提取器。

@Configuration
class MyConfiguration {

  @Bean
  EventExternalizingConfiguration config(SomeBean bean) {

    return EventExternalizingConfiguration.defaults(…)
        .headers(event -> Map.of(<font>"signature", bean.signMessage(event)))
        .build();
  }
}


為了動態計算外部化事件的路由目標,除了之前已經支援的動態路由鍵之外,@Externalized 現在還支援 SpEL 表示式來定義這些表示式。 我們的好朋友 Josh Long 提供了一個新的外部化介面卡,用於將事件寫入 Spring 的 MessageChannel 抽象。

Spring Integration 的訊息通道實現了這一介面,因此您現在可以根據需要將應用程式事件無縫地輸入到這些通道中。 對亞馬遜 SQS 和 SNS 事件外部化的支援已被轉移到當前釋出的 Spring Cloud for AWS 中(感謝 Maciej Walkowiak 提供的支援)。

因此,我們正式放棄了自己的實現,轉而使用它們,它們是 Spring Modulith 本機實現的副本,可以直接替換。 我們計劃在明年釋出 2.0 版本時移除我們的工件。


文件支援:

  • 預設文件生成過程現在產生一個聚合文件,包含所有建立的單獨構件,方便預覽。
  • 提供了自動提取程式碼庫中Javadoc的註解處理器,並更新了畫布生成以透明使用。

第三方整合:

  • 如果類路徑上存在jMolecules提供的基於ArchUnit的架構驗證,則會自動觸發。

這些更新為Spring Modulith的使用者帶來了更多的靈活性和便利性,特別是在模組化、整合測試和事件處理方面。如果您需要更詳細的資訊或有其他問題,請隨時告知。

相關文章