領先一步
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
屬性在後臺初始化。
@Configuration
class MyConfiguration {
@Bean(bootstrap = BACKGROUND)
MyExpensiveComponent myComponent() {
...
}
}
檢視參考文件瞭解有關此新功能的更多詳細資訊。
Spring Framework 6.2.0-M1
也允許對計劃任務使用 TaskDecorator
,從而在此過程中統一任務執行和排程。請參閱相關問題瞭解更多詳情。
我們喜歡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
覆蓋為此里程碑版本。請嘗試一下,並告訴我們結果如何。
編碼愉快!