JCache (JSR-107) 註解

從 4.1 版本開始,Spring 的快取抽象完全支援 JCache 標準 (JSR-107) 註解:@CacheResult@CachePut@CacheRemove@CacheRemoveAll,以及配套的 @CacheDefaults@CacheKey@CacheValue。即使不將快取儲存遷移到 JSR-107,你也可以使用這些註解。內部實現使用 Spring 的快取抽象,並提供符合規範的預設 CacheResolverKeyGenerator 實現。換句話說,如果你已經在使用 Spring 的快取抽象,你可以切換到這些標準註解,而無需更改你的快取儲存(或配置)。

功能摘要

對於熟悉 Spring 快取註解的使用者,下表描述了 Spring 註解與 JSR-107 對應項之間的主要區別。

表 1. Spring 與 JSR-107 快取註解
Spring JSR-107 備註

@Cacheable

@CacheResult

非常相似。@CacheResult 可以快取特定異常,並強制執行方法,而不管快取的內容如何。

@CachePut

@CachePut

雖然 Spring 用方法呼叫的結果更新快取,但 JCache 要求將其作為用 @CacheValue 註解的引數傳遞。由於此差異,JCache 允許在實際方法呼叫之前或之後更新快取。

@CacheEvict

@CacheRemove

非常相似。@CacheRemove 支援在方法呼叫導致異常時進行有條件的逐出。

@CacheEvict(allEntries=true)

@CacheRemoveAll

請參閱 @CacheRemove

@CacheConfig

@CacheDefaults

以類似的方式配置相同的概念。

JCache 具有 javax.cache.annotation.CacheResolver 的概念,它與 Spring 的 CacheResolver 介面相同,只是 JCache 僅支援單個快取。預設情況下,一個簡單的實現根據註解上宣告的名稱檢索要使用的快取。值得注意的是,如果註解上沒有指定快取名稱,則會自動生成一個預設名稱。有關更多資訊,請參閱 @CacheResult#cacheName() 的 Javadoc。

CacheResolver 例項由 CacheResolverFactory 檢索。可以為每個快取操作自定義工廠,如以下示例所示。

@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) (1)
public Book findBook(ISBN isbn)
1 為該操作自定義工廠。
對於所有引用的類,Spring 都會嘗試查詢具有給定型別的 bean。如果存在多個匹配項,則會建立一個新例項,並且可以使用常規的 bean 生命週期回撥,例如依賴注入。

鍵由 javax.cache.annotation.CacheKeyGenerator 生成,其目的與 Spring 的 KeyGenerator 相同。預設情況下,所有方法引數都將被考慮,除非至少一個引數被 @CacheKey 註解。這類似於 Spring 的自定義鍵生成宣告。例如,以下是相同的操作,一個使用 Spring 的抽象,另一個使用 JCache。

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

@CacheResult(cacheName="books")
public Book findBook(@CacheKey ISBN isbn, boolean checkWarehouse, boolean includeUsed)

你還可以在操作上指定 CacheKeyResolver,類似於指定 CacheResolverFactory 的方式。

JCache 可以管理由註解方法丟擲的異常。這可以防止快取更新,但也可以將異常快取作為失敗的指示,而不是再次呼叫方法。假設如果 ISBN 結構無效,則丟擲 InvalidIsbnNotFoundException。這是一個永久性故障(使用此類引數永遠無法檢索到書籍)。以下內容會快取異常,因此使用相同且無效的 ISBN 進行後續呼叫將直接丟擲快取的異常,而不是再次呼叫該方法。

@CacheResult(cacheName="books", exceptionCacheName="failures"
			cachedExceptions = InvalidIsbnNotFoundException.class)
public Book findBook(ISBN isbn)

啟用 JSR-107 支援

你不需要執行任何特定操作來啟用 JSR-107 支援以及 Spring 的宣告式註解支援。如果 JSR-107 API 和 spring-context-support 模組都存在於類路徑中,則 @EnableCachingcache:annotation-driven XML 元素都會自動啟用 JCache 支援。

根據你的用例,選擇權基本上在你手中。你甚至可以透過在某些服務上使用 JSR-107 API,而在其他服務上使用 Spring 自己的註解來混合搭配服務。但是,如果這些服務影響相同的快取,則應使用一致且相同的鍵生成實現。
© . This site is unofficial and not affiliated with VMware.