此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
JCache (JSR-107) 注解
从 4.1 版开始, Spring 的缓存抽象完全支持 JCache 标准
(JSR-107) 注释:、、、 以及 、 和 同伴。
即使不将缓存存储迁移到 JSR-107,也可以使用这些注释。
内部实现使用 Spring 的缓存抽象,并提供符合
规范。换句话说,如果您已经在使用 Spring 的缓存抽象,
您可以切换到这些标准注释,而无需更改缓存存储
(或配置)。@CacheResult
@CachePut
@CacheRemove
@CacheRemoveAll
@CacheDefaults
@CacheKey
@CacheValue
CacheResolver
KeyGenerator
功能摘要
对于那些熟悉 Spring 缓存 Comments 的人来说,下表 描述了 Spring 注解与其 JSR-107 之间的主要区别 同行:
Spring | JSR-107 规范 | 备注 |
---|---|---|
|
|
相当相似。 可以缓存特定的异常并强制
执行该方法,而不考虑缓存的内容。 |
|
|
虽然 Spring 使用方法调用的结果更新缓存,但 JCache
要求将其作为带有 .
由于这种差异, JCache 允许在
实际方法调用。 |
|
|
相当相似。 支持条件驱逐,当
方法调用会导致异常。 |
|
|
看。 |
|
|
允许您以类似的方式配置相同的概念。 |
JCache 有 的概念 ,它是相同的
添加到 Spring 的接口中,除了 JCache 仅支持单个
缓存。默认情况下,一个简单的实现会根据
name 声明的 NAME 的注释。需要注意的是,如果没有缓存名称是
在注释上指定,则会自动生成默认值。请参阅 javadoc
了解更多信息。javax.cache.annotation.CacheResolver
CacheResolver
@CacheResult#cacheName()
CacheResolver
实例由 .这是可能的
为每个缓存操作自定义工厂,如下例所示:CacheResolverFactory
@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) (1)
public Book findBook(ISBN isbn)
1 | 为此操作自定义工厂。 |
对于所有引用的类, Spring 尝试查找具有给定类型的 bean。 如果存在多个匹配项,则会创建一个新实例,并且可以使用常规的 Bean 生命周期回调,例如依赖项注入。 |
键由 为
与 Spring 的 .默认情况下,所有方法参数都被采用
考虑,除非至少有一个参数用 .这是
类似于 Spring 的 custom key generation declaration 。例如,以下是相同的操作,一个使用
Spring 的抽象和另一个使用 JCache 的抽象:javax.cache.annotation.CacheKeyGenerator
KeyGenerator
@CacheKey
@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)
您还可以指定 on 操作,类似于
指定 .CacheKeyResolver
CacheResolverFactory
JCache 可以管理带注释的方法引发的异常。这可以防止
缓存,但它也可以缓存异常作为失败的指示器,而不是
再次调用该方法。假设如果
ISBN 的结构无效。这是一个永久性的失败(没有一本书可能是
使用此类参数检索)。以下内容缓存异常,以便进一步
具有相同无效 ISBN 的调用直接引发缓存的异常,而不是
再次调用该方法:InvalidIsbnNotFoundException
@CacheResult(cacheName="books", exceptionCacheName="failures"
cachedExceptions = InvalidIsbnNotFoundException.class)
public Book findBook(ISBN isbn)
启用 JSR-107 支持
您无需执行任何特定操作即可启用 JSR-107 支持以及 Spring 的
声明性注释支持。如果 JSR-107 API 和模块都存在于 Classpath 中,则 Both 和 XML 元素都会自动启用 JCache 支持。@EnableCaching
cache:annotation-driven
spring-context-support
根据您的使用案例,选择权基本上在您手中。您甚至可以混合和 通过在某些服务上使用 JSR-107 API 并在 Spring 上使用 Spring 自己的注释来匹配服务 别人。但是,如果这些服务影响相同的缓存,则应使用一致的 和相同的密钥生成实现。 |