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 屬性在後臺初始化。

@Configuration
class MyConfiguration {

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

}

檢視參考文件瞭解有關此新功能的更多詳細資訊。

對計劃任務的 TaskDecorator 支援

Spring Framework 6.2.0-M1 也允許對計劃任務使用 TaskDecorator,從而在此過程中統一任務執行和排程。請參閱相關問題瞭解更多詳情。

對 MockMvc 的 AssertJ 支援

我們喜歡AssertJ!雖然 Spring Boot 在一段時間前已經搭上了這趟列車並提供了許多使用它的測試工具,但框架團隊一直比較保守。與此同時,我們認識到我們對 Hamcrest 的支援可能無法滿足所有人的需求:使用靜態匯入使得 API 不易發現,並且編寫自定義斷言更困難。

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

構建 AssertableMockMvc 例項更加直接,類本身提供了專門的工廠方法。如果您手頭有 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 社群所有即將舉行的活動。

檢視全部