此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
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 只支持一个 缓存。 默认情况下,一个简单的实现会根据name 在注释上声明。应该注意的是,如果没有缓存名称在注释上指定,则会自动生成默认值。请参阅 javadoc 之@CacheResult#cacheName()
了解更多信息。
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 可以管理带注释的方法抛出的异常。这可以防止更新缓存,但它也可以缓存异常作为失败的指示器,而不是再次调用该方法。假设InvalidIsbnNotFoundException
如果ISBN 的结构无效。这是一个永久性的失败(任何书都不能被使用这样的参数检索)。以下缓存异常,以便进一步使用相同的无效 ISBN 直接抛出缓存的异常,而不是再次调用该方法:
@CacheResult(cacheName="books", exceptionCacheName="failures"
cachedExceptions = InvalidIsbnNotFoundException.class)
public Book findBook(ISBN isbn)
启用 JSR-107 支持
您无需执行任何特定作即可启用 JSR-107 支持以及 Spring 的声明式注释支持。 双@EnableCaching
和cache:annotation-driven
如果 JSR-107 API 和spring-context-support
模块存在于类路径中。
根据您的用例,选择基本上是您的。您甚至可以混合和 通过在某些上使用 JSR-107 API 并在 别人。但是,如果这些服务影响相同的缓存,则应使用一致的 以及相同的密钥生成实现。 |