Spring Framework 6.2.0-M1:所有的小細節

工程 | Stéphane Nicoll | 2024年4月11日 | ...

Spring Framework 團隊一直忙於憤怒地審查問題追蹤器,並減少已開啟問題的數量。這早就應該做了,因為許多問題在此期間已失效或被取代。這幫助團隊專注於更可管理的問題數量,我們也藉此機會查看了長期存在但我們還沒有時間解決的問題。

在這篇文章中,我想帶您瀏覽一系列相對較小的問題,有時是高票選的問題,這些問題終於在這個里程碑版本中提供了。

支援跳脫屬性佔位符

屬性佔位符是一種在任意字串中替換環境變數屬性的方法。假設 Environment 中將 customer.name 設定為 "John Smith",則 "Customer ${customer.name}" 將解析為 "Customer John Smith"。

在某些特殊情況下,您可能希望保留原始值,而不是解析後的值。一個問題在 2008 年被提出,並獲得了相當多的票數。Spring Framework 6.2.0-M1 允許您使用可配置的跳脫字元(預設為反斜線)來跳脫佔位符。以前面的例子來說,"Customer \${customer.name}" 現在會解析為 "Customer ${customer.name}"。

這看起來像是一個無傷大雅的變更,為什麼我們花了這麼長時間才修復它呢?事實證明,我們必須從頭重寫解析器,這也帶來了其他正面的副作用:預設值現在是延遲解析的,並且異常訊息在解析巢狀佔位符時提供了解析鏈。

支援回退 Bean

這個 高票選問題 也已解決,並在製作可能需要回退 Bean 的配置時,為您提供更多控制權。如果沒有提供該類型的 Bean,則會使用回退 Bean。這本質上是 @Primary 的同伴,但沒有必須指定它的權衡取捨。

考慮到組件需要定義 MyService。您可以為服務提供預設實作,但您希望如果使用者指定了一個實作,則可以透過類型透明地注入。到目前為止,使用者必須使用 @Primary 配置其特定的 Bean,以確保它被使用,因為現在定義了兩個該類型的 Bean。

從 Spring Framework 6.2.0-M1 開始,您可以使用 @Fallback 製作您的配置

@Configuration
class MyConfiguration {

	@Bean
	MyComponent myComponent(MyService service) {
    	...
	}

	@Bean
	@Fallback
	MyService defaultMyService() {
    	...
	}

}

您可以猜到,如果沒有定義其他 MyService Bean,則會使用 defaultMyService。否則,容器將透明地選擇外部定義的 Bean。

Bean 背景初始化

有史以來票選最多的問題之一 也已在這個里程碑版本中解決。可以使用新引入的 bootstrap 屬性在背景中初始化個別 Bean。

@Configuration
class MyConfiguration {

    @Bean(bootstrap = BACKGROUND)
    MyExpensiveComponent myComponent() {
   	 ...
    }

}

請查看 參考指南,以瞭解有關這項新功能的更多詳細資訊。

TaskDecorator 支援排程任務

Spring Framework 6.2.0-M1 也允許對排程任務使用 TaskDecorator,從而在過程中協調任務執行和排程。請參閱 相關問題 以瞭解更多詳細資訊。

AssertJ 支援 MockMvc

我們熱愛 AssertJ!雖然 Spring Boot 早在之前就已採用它,並提供了幾個使用它的測試工具,但 framework 團隊一直比較保守。同時,我們意識到 我們的 Hamcrest 支援可能不符合所有人的需求:靜態匯入的使用使 API 更難以發現,並且編寫自訂斷言也更困難。

Spring Framework 6.2.0-M1 提供了對使用 MockMvc 和 AssertJ 測試您的 Web 應用程式的完整支援。

建立 AssertableMockMvc 實例更加直接,在類別本身上有專用的 factory 方法。如果您手邊有 WebApplicationContext,這就像 AssertableMockMvc.from(webApplicationContext) 一樣簡單。如果您只想在單元測試中測試控制器,您可以按如下方式操作

AssertableMockMvc mvc = AssertableMockMvc.of(List.of(new HelloController()), builder ->
    	builder.defaultRequest(get("/hello").accept(MediaType.APPLICATION_JSON)).build());

一旦您有了實例,您就可以執行常用的請求,並將其包裝在 AssertJ 的標準 assertThat

assertThat(mvc.perform(get("/vehicle/{id}", "12").accept(MediaType.TEXT_PLAIN))).hasStatusOk()
    	.body().isEqualTo("Honda Civic");

第一個里程碑版本涵蓋了與現有 Hamcrest matcher 相同的功能,並透過進階 JSON 支援對其進行了擴展,例如

assertThat(perform(get("/message"))).body().json()
    	.isLenientlyEqualTo(new ClassPathResource("samples/message.json"));

這是 API 的第一個版本,我們期待社群回饋來改進它。

還有更多!

Spring Framework 6.2.0-M1 解決了超過 一百個問題,其中包含了許多增強功能,請期待在未來幾週內從我們這裡獲得更多資訊。

在有基於它建構的 Spring Boot 3.4 快照版本之前,您必須覆寫 spring-framework.version 為里程碑版本。請嘗試一下,並告訴我們情況如何。

祝您編碼愉快!

取得 Spring 電子報

保持與 Spring 電子報的連線

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

瞭解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部