領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多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}”。
這看起來是一個微不足道的更改,為什麼我們花了這麼長時間才修復它?!事實證明,我們不得不從頭開始重寫解析器,這帶來了其他積極的副作用:預設值現在是惰性解析的,並且在解析巢狀佔位符時,異常訊息提供瞭解析鏈。
這個投票率很高的 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。
有史以來投票最多的 issue 之一也在此里程碑版本中得到解決。可以透過新引入的bootstrap屬性在後臺初始化單個 Bean。
@Configuration
class MyConfiguration {
@Bean(bootstrap = BACKGROUND)
MyExpensiveComponent myComponent() {
...
}
}
有關此新功能的更多詳細資訊,請參閱參考指南。
Spring Framework 6.2.0-M1也允許將TaskDecorator用於計劃任務,從而統一了任務執行和排程。有關更多詳細資訊,請參閱相關 issue。
我們熱愛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到該里程碑版本。請嘗試一下,並告知我們進展如何。
祝您編碼愉快!