Spring Framework 4.3 的核心容器改進

工程 | Stéphane Nicoll | 2016 年 3 月 4 日 | ...

Spring Framework 4.3.RC1 即將釋出,帶來了許多核心容器的改進,我們將在本文中一一探討……

單建構函式場景下的隱式建構函式注入

考慮以下服務類

@Service
public class FooService {

    private final FooRepository repository;

    @Autowired
    public FooService(FooRepository repository) {
        this.repository = repository
    }
}

這是一個非常常見的用例,但如果您忘記在建構函式上新增 @Autowired 註解,容器將丟擲異常,尋找一個預設建構函式,除非您在 bean 定義設定中(例如,在 XML <bean> 中)明確指示了自動裝配模式為“constructor”。

因此,從 4.3 版本開始,您不再需要在這種單建構函式場景下指定顯式的注入註解。這對於那些通常不包含任何容器註解的類來說尤其優雅,例如在以程式設計方式註冊時。

public class FooService {

    private final FooRepository repository;

    public FooService(FooRepository repository) {
        this.repository = repository
    }
}

同樣,您可能已經注意到 @Configuration 類在歷史上不支援建構函式注入。從 4.3 版本開始,它們現在支援了,並且在單建構函式場景下同樣允許省略 @Autowired……

@Configuration
public class FooConfiguration {

    private final FooRepository repository;

    public FooConfiguration(FooRepository repository) {
        this.repository = repository
    }

    @Bean
    public FooService fooService() {
        return new FooService(this.repository);
    }
}

改進的程式設計依賴解析

Spring Framework 4.3 還引入了 ObjectProvider,它是現有 ObjectFactory 介面的擴充套件,提供了一些便捷的簽名,如 getIfAvailablegetIfUnique,用於僅在 bean 確實存在(可選支援)或可以確定單個候選(特別是在有多個匹配 bean 時,一個主候選)時檢索 bean。

@Service
public class FooService {

    private final FooRepository repository;

    public FooService(ObjectProvider<FooRepository> repositoryProvider) {
        this.repository = repositoryProvider.getIfUnique();
    }
}

您可以將此 ObjectProvider 控制代碼用於初始化期間的自定義解析目的(如上所示),或者將其控制代碼儲存在欄位中以供以後按需解析(就像您通常使用 ObjectFactory 一樣)。

快取抽象改進

快取抽象主要用於快取 CPU 和/或 IO 消耗大的值。在某些用例中,一個給定的鍵可能會被多個執行緒(即客戶端)並行請求,尤其是在啟動時。同步快取支援是一個長期以來一直被要求的功能,現在已經實現。假設以下示例

@Service
public class FooService {

    @Cacheable(cacheNames = "foos", sync = true)
    public Foo getFoo(String id) { ... }

}

注意 sync = true 屬性,它會告訴框架在計算值期間阻止任何併發執行緒。在併發訪問的情況下,這將確保此密集操作僅被呼叫一次。

順便說一句,Spring Framework 4.3 現在支援 Caffeine,它是 Guava 快取的一個 Java 8 重寫版本,旨在取代 Spring Framework 5 中的 Guava 支援。

雜項

還有一些其他的核心改進,其中一些是長期以來備受期待的

  • 注入自引用和泛型型別的 Collection/Map bean
  • 支援 Common Annotations 1.1 的 javax.annotation.Resource.lookup()
  • @AliasFor 預設使用宣告屬性的名稱
  • @PropertySource 宣告提供自定義編碼支援
  • SpEL 表示式的更廣泛適用性(例如,在 @Scheduled 上)

Spring Framework 4.3.0.RC1 預計在三月下旬釋出,GA 版本計劃在五月底釋出。如果您對這些功能感興趣,請儘快嘗試使用快照版本:最簡單的方法是在 https://start.spring.io 上生成一個專案,使用 Spring Boot 1.4.0 (SNAPSHOT),這將帶來當前的 Spring Framework 4.3 快照。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

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

瞭解更多

獲得支援

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

瞭解更多

即將舉行的活動

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

檢視所有