此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

JCache (JSR-107) 注释

从 4.1 版本开始,Spring 的缓存抽象完全支持 JCache 标准 (JSR-107) 注释:@CacheResult,@CachePut,@CacheRemove@CacheRemoveAll以及@CacheDefaults,@CacheKey@CacheValue同伴。 即使不将缓存存储迁移到 JSR-107,您也可以使用这些注解。 内部实现使用 Spring 的缓存抽象并提供默认CacheResolverKeyGenerator符合 规范。换句话说,如果您已经在使用 Spring 的缓存抽象, 您可以在不更改缓存存储的情况下切换到这些标准注释 (或配置,就此而言)。spring-doc.cadn.net.cn

功能摘要

对于熟悉 Spring 缓存注解的用户,下表 描述了 Spring 注解与其 JSR-107 之间的主要区别 同行:spring-doc.cadn.net.cn

表 1.Spring 与 JSR-107 缓存注释
Spring JSR-107型 备注

@Cacheablespring-doc.cadn.net.cn

@CacheResultspring-doc.cadn.net.cn

相当相似。@CacheResult可以缓存特定异常并强制 无论缓存的内容如何,方法的执行。spring-doc.cadn.net.cn

@CachePutspring-doc.cadn.net.cn

@CachePutspring-doc.cadn.net.cn

当 Spring 使用方法调用的结果更新缓存时,JCache 要求将其作为参数传递,并用@CacheValue. 由于这种差异,JCache 允许在 实际方法调用。spring-doc.cadn.net.cn

@CacheEvictspring-doc.cadn.net.cn

@CacheRemovespring-doc.cadn.net.cn

相当相似。@CacheRemove当 方法调用会导致异常。spring-doc.cadn.net.cn

@CacheEvict(allEntries=true)spring-doc.cadn.net.cn

@CacheRemoveAllspring-doc.cadn.net.cn

@CacheRemove.spring-doc.cadn.net.cn

@CacheConfigspring-doc.cadn.net.cn

@CacheDefaultsspring-doc.cadn.net.cn

允许您以类似的方式配置相同的概念。spring-doc.cadn.net.cn

JCache 的概念是javax.cache.annotation.CacheResolver,这是相同的 到Spring的CacheResolver接口,只不过 JCache 只支持一个 缓存。默认情况下,一个简单的实现会根据 name 在注释上声明。需要注意的是,如果没有缓存名称 在注释上指定,则会自动生成默认值。请参阅 javadoc 之@CacheResult#cacheName()了解更多信息。spring-doc.cadn.net.cn

CacheResolver实例由CacheResolverFactory.有可能 为每个缓存作自定义工厂,如以下示例所示:spring-doc.cadn.net.cn

@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 的抽象:spring-doc.cadn.net.cn

@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.spring-doc.cadn.net.cn

JCache 可以管理由带注释的方法抛出的异常。这可以防止更新 缓存,但它也可以缓存异常作为失败的指示器,而不是 再次调用该方法。假设InvalidIsbnNotFoundException如果 ISBN 的结构无效。这是永久性的失败(没有一本书可以 使用这样的参数检索)。下面缓存异常,以便进一步 具有相同、无效的 ISBN 的调用会直接抛出缓存异常,而不是 再次调用该方法:spring-doc.cadn.net.cn

@CacheResult(cacheName="books", exceptionCacheName="failures"
			cachedExceptions = InvalidIsbnNotFoundException.class)
public Book findBook(ISBN isbn)

启用 JSR-107 支持

您无需执行任何特定作即可启用 JSR-107 支持以及 Spring 的声明式注释支持。 双@EnableCachingcache:annotation-driven如果 JSR-107 API 和spring-context-support模块存在于类路径中。spring-doc.cadn.net.cn

根据您的用例,选择基本上是您的。您甚至可以混合和匹配服务,方法是在某些 API 上使用 JSR-107 API 并在 别人。 但是,如果这些服务影响相同的缓存,则应使用一致的和相同的密钥生成实现。