Spring Framework 參考文檔(JCache(JSR-107)註解)

JCache(JSR-107)註解

從4.1版開始,Spring的緩存抽象徹底支持JCache標準註解:@CacheResult@CachePut@CacheRemove@CacheRemoveAll以及@CacheDefaults@CacheKey@CacheValue。即便不將緩存存儲庫遷移到JSR-107,也可使用這些註解,內部實現使用Spring的緩存抽象,並提供符合規範的默認CacheResolverKeyGenerator實現。換句話說,若是你已經在使用Spring的緩存抽象,則能夠切換到這些標準註解,而無需更改緩存存儲(或配置,就此而言)。java

特性摘要

對於那些熟悉Spring的緩存註解的,下表描述了Spring註解與JSR-107版本之間的主要區別:spring

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。segmentfault

CacheResolver實例由CacheResolverFactory檢索,能夠爲每一個緩存操做自定義工廠,如如下示例所示:緩存

@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) 
public Book findBook(ISBN isbn)
對於全部引用的類,Spring嘗試查找具備給定類型的bean,若是存在多個匹配項,則會建立一個新實例,而且可使用常規bean生命週期回調,例如依賴項注入。

鍵由javax.cache.annotation.CacheKeyGenerator生成,其做用與Spring的KeyGenerator相同,默認狀況下,除非至少有一個參數使用@CacheKey註解,不然將考慮全部方法參數,這相似於Spring的自定義鍵生成聲明,例如,如下是相同的操做,一個使用Spring的抽象,另外一個使用JCache:code

@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支持

除了Spring的聲明性註解支持以外,你無需執行任何特定的操做來啓用JSR-107支持,若是JSR-107 API和spring-context-support模塊都存在於類路徑中,則@EnableCachingcache:annotation-driven元素都會自動啓用JCache支持。get

根據你的用例,選擇基本上是你本身的,你甚至能夠在某些服務上使用JSR-107 API並在其餘服務上使用Spring本身的註解來混合和匹配服務。可是,若是這些服務影響相同的緩存,則應使用一致且相同的鍵生成實現。

上一篇:聲明式基於註解的緩存

相關文章
相關標籤/搜索