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 要求將其作為用 `@CacheValue` 註解的引數傳遞。由於這種差異,JCache 允許在實際方法呼叫之前或之後更新快取。 |
|
|
非常相似。當方法呼叫導致異常時,`@CacheRemove` 支援條件性驅逐。 |
|
|
參見 `@CacheRemove`。 |
|
|
允許你以類似的方式配置相同的概念。 |
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)