JCache (JSR-107) 註解
從 4.1 版本開始,Spring 的快取抽象完全支援 JCache 標準 (JSR-107) 註解:@CacheResult、@CachePut、@CacheRemove 和 @CacheRemoveAll,以及配套的 @CacheDefaults、@CacheKey 和 @CacheValue。即使不將快取儲存遷移到 JSR-107,你也可以使用這些註解。內部實現使用 Spring 的快取抽象,並提供符合規範的預設 CacheResolver 和 KeyGenerator 實現。換句話說,如果你已經在使用 Spring 的快取抽象,你可以切換到這些標準註解,而無需更改你的快取儲存(或配置)。
功能摘要
對於熟悉 Spring 快取註解的使用者,下表描述了 Spring 註解與 JSR-107 對應項之間的主要區別。
| Spring | JSR-107 | 備註 |
|---|---|---|
|
|
非常相似。 |
|
|
雖然 Spring 用方法呼叫的結果更新快取,但 JCache 要求將其作為用 |
|
|
非常相似。 |
|
|
請參閱 |
|
|
以類似的方式配置相同的概念。 |
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)