JCache (JSR-107) 注解
从 4.1 版开始,Infra 缓存抽象完全支持 JCache 标准 (JSR-107) 注解:@CacheResult、@CachePut、@CacheRemove 和 @CacheRemoveAll 以及 @CacheDefaults、@CacheKey 和 @CacheValue 配套组件。
即使不将缓存存储迁移到 JSR-107,您也可以使用这些注解。内部实现使用 Infra 缓存抽象,并提供符合规范的默认 CacheResolver 和 KeyGenerator 实现。换句话说,如果您已经在使用 Infra 缓存抽象,则可以切换到这些标准注解,而无需更改缓存存储(或配置)。
功能摘要
对于熟悉 Infra 缓存注解的人员,下表描述了 Infra 注解与其 JSR-107 对应项之间的主要区别:
| Infra | JSR-107 | 备注 |
|---|---|---|
|
|
相当相似。 |
|
|
虽然 Infra 使用方法调用的结果更新缓存,但 JCache 要求将其作为使用 |
|
|
相当相似。当方法调用导致异常时, |
|
|
参见 |
|
|
允许您以类似的方式配置相同的概念。 |
JCache 具有 javax.cache.annotation.CacheResolver 的概念,它与 Infra CacheResolver 接口相同,只是 JCache 仅支持单个缓存。默认情况下,简单的实现根据注解上声明的名称检索要使用的缓存。应当注意,如果在注解上未指定缓存名称,则会自动生成默认名称。有关更多信息,请参阅 @CacheResult#cacheName() 的 javadoc。
CacheResolver 实例由 CacheResolverFactory 检索。可以为每个缓存操作自定义工厂,如下例所示:
@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) (1)
public Book findBook(ISBN isbn)
| 1 | 为此操作自定义工厂。 |
| 对于所有引用的类,Infra 尝试定位具有给定类型的 bean。如果存在多个匹配项,则创建一个新实例,并可以使用常规 bean 生命周期回调,例如依赖注入。 |
键由 javax.cache.annotation.CacheKeyGenerator 生成,其用途与 Infra KeyGenerator 相同。默认情况下,除非至少有一个参数使用 @CacheKey 注解,否则将考虑所有方法参数。这类似于 Infra 自定义键生成声明。例如,以下是相同的操作,一个使用 Infra 抽象,另一个使用 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)