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 定義設定中明確指定 autowire 模式 'constructor'(例如,在 XML <bean> 中)。

因此,從 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 中的 Spring 的 Guava 支援。

其他

還有很多其他的核心改進,其中一些是長期渴望的

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

Spring Framework 4.3.0.RC1 預計於 3 月底釋出,GA 計劃於 5 月底釋出。如果您對這些功能感興趣,請儘早使用快照試用:最簡單的方法是在 https://start.spring.io 上使用 Spring Boot 1.4.0 (SNAPSHOT) 生成一個專案,其中包含當前的 Spring Framework 4.3 快照。

獲取 Spring 新聞通訊

保持與 Spring 新聞通訊的聯絡

訂閱

領先一步

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

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

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

檢視全部