從4.1版開始,Spring的緩存抽象徹底支持JCache標準註解:@CacheResult
、@CachePut
、@CacheRemove
和@CacheRemoveAll
以及@CacheDefaults
、@CacheKey
和@CacheValue
。即便不將緩存存儲庫遷移到JSR-107,也可使用這些註解,內部實現使用Spring的緩存抽象,並提供符合規範的默認CacheResolver
和KeyGenerator
實現。換句話說,若是你已經在使用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)
除了Spring的聲明性註解支持以外,你無需執行任何特定的操做來啓用JSR-107支持,若是JSR-107 API和spring-context-support
模塊都存在於類路徑中,則@EnableCaching
和cache:annotation-driven
元素都會自動啓用JCache支持。get
根據你的用例,選擇基本上是你本身的,你甚至能夠在某些服務上使用JSR-107 API並在其餘服務上使用Spring本身的註解來混合和匹配服務。可是,若是這些服務影響相同的緩存,則應使用一致且相同的鍵生成實現。