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 定義設定中明確指示自動注入模式 '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 的值。 在某些用例中,給定的 key 可能會被多個執行緒 (即客戶端) 並行請求,尤其是在啟動時。 同步快取支援是一個長期要求的特性,現在已經實現。 假設以下情況

@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 Beans
  • 支援 Common Annotations 1.1 的 javax.annotation.Resource.lookup()
  • @AliasFor 預設為宣告屬性的名稱
  • @PropertySource 宣告提供自定義編碼支援
  • 更廣泛地應用 SpEL 表達式 (例如,在 @Scheduled 上)

Spring Framework 4.3.0.RC1 預計將於 3 月下旬推出,GA 計劃於 5 月底推出。 如果您對這些功能感興趣,請使用快照盡早嘗試:最簡單的方法是使用 Spring Boot 1.4.0 (SNAPSHOT)https://start.spring.io 上生成一個專案,同時引入當前的 Spring Framework 4.3 快照。

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

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

瞭解更多

取得支援

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

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部