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年建立了一個issue,獲得了相當多的投票。Spring Framework 6.2.0-M1允許您使用可配置的跳脫字元(預設為反斜槓)來轉義佔位符。以我們之前的例子為例,“Customer \${customer.name}”現在解析為“Customer ${customer.name}”。

這看起來是一個微不足道的更改,為什麼我們花了這麼長時間才修復它?!事實證明,我們不得不從頭開始重寫解析器,這帶來了其他積極的副作用:預設值現在是惰性解析的,並且在解析巢狀佔位符時,異常訊息提供瞭解析鏈。

回退 Bean 支援

這個投票率很高的 issue也得到了解決,併為您在構建可能需要回退 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 後臺初始化

有史以來投票最多的 issue 之一也在此里程碑版本中得到解決。可以透過新引入的bootstrap屬性在後臺初始化單個 Bean。

@Configuration
class MyConfiguration {

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

}

有關此新功能的更多詳細資訊,請參閱參考指南

TaskDecorator 對計劃任務的支援

Spring Framework 6.2.0-M1也允許將TaskDecorator用於計劃任務,從而統一了任務執行和排程。有關更多詳細資訊,請參閱相關 issue

AssertJ 對 MockMvc 的支援

我們熱愛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 匹配器相同的功能,並擴充套件了它,例如支援高階 JSON。

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

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

還有更多!

隨著超過一百個 issue 的解決,Spring Framework 6.2.0-M1充滿了增強功能,預計我們將在未來幾周內釋出更多資訊。

在有基於它構建的 Spring Boot 3.4 快照之前,您必須覆蓋spring-framework.version到該里程碑版本。請嘗試一下,並告知我們進展如何。

祝您編碼愉快!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有