領先一步
VMware 提供培訓和認證,以加速您的進展。
瞭解更多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。這本質上是 @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。
有史以來票選最多的問題之一 也已在這個里程碑版本中解決。可以使用新引入的 bootstrap
屬性在背景中初始化個別 Bean。
@Configuration
class MyConfiguration {
@Bean(bootstrap = BACKGROUND)
MyExpensiveComponent myComponent() {
...
}
}
請查看 參考指南,以瞭解有關這項新功能的更多詳細資訊。
Spring Framework 6.2.0-M1
也允許對排程任務使用 TaskDecorator
,從而在過程中協調任務執行和排程。請參閱 相關問題 以瞭解更多詳細資訊。
我們熱愛 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
為里程碑版本。請嘗試一下,並告訴我們情況如何。
祝您編碼愉快!