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)