此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

从 4.1 版本开始,Spring 的缓存抽象完全支持 JCache 标准 (JSR-107) 注释:、以及 、 和 配套。 即使不将缓存存储迁移到 JSR-107,也可以使用这些注解。 内部实现使用 Spring 的缓存抽象,并提供默认和符合 规范。换句话说,如果你已经在使用 Spring 的缓存抽象, 您可以切换到这些标准注释,而无需更改缓存存储 (或配置,就此而言)。@CacheResult@CachePut@CacheRemove@CacheRemoveAll@CacheDefaults@CacheKey@CacheValueCacheResolverKeyGeneratorSpring中文文档

功能摘要

对于那些熟悉 Spring 缓存注解的人来说,下表 描述了 Spring 注解与其 JSR-107 之间的主要区别 同行:Spring中文文档

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

@CacheableSpring中文文档

@CacheResultSpring中文文档

相当相似。 可以缓存特定的异常并强制 无论缓存的内容如何,都执行该方法。@CacheResultSpring中文文档

@CachePutSpring中文文档

@CachePutSpring中文文档

当 Spring 使用方法调用的结果更新缓存时, JCache 要求将其作为用 注释的参数传递。 由于这种差异, JCache 允许在 实际方法调用。@CacheValueSpring中文文档

@CacheEvictSpring中文文档

@CacheRemoveSpring中文文档

相当相似。 支持条件逐出,当 方法调用会导致异常。@CacheRemoveSpring中文文档

@CacheEvict(allEntries=true)Spring中文文档

@CacheRemoveAllSpring中文文档

看。@CacheRemoveSpring中文文档

@CacheConfigSpring中文文档

@CacheDefaultsSpring中文文档

允许您以类似的方式配置相同的概念。Spring中文文档

JCache 有 的概念,它是相同的 到 Spring 的界面,除了 JCache 只支持一个 缓存。默认情况下,简单实现根据 在注释中声明的名称。需要注意的是,如果没有缓存名称 在注释上指定,将自动生成默认值。查看 javadoc 的以获取更多信息。javax.cache.annotation.CacheResolverCacheResolver@CacheResult#cacheName()Spring中文文档

CacheResolver实例由 .这是可能的 自定义每个缓存操作的出厂条件,如以下示例所示:CacheResolverFactorySpring中文文档

@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) (1)
public Book findBook(ISBN isbn)
1 为此操作自定义工厂。
对于所有引用的类,Spring 会尝试找到具有给定类型的 bean。 如果存在多个匹配项,则创建一个新实例,并且可以使用常规实例 Bean 生命周期回调,例如依赖注入。

密钥由服务于 与Spring的相同目的。默认情况下,将采用所有方法参数 考虑在内,除非至少有一个参数用 .这是 类似于 Spring 的自定义密钥生成声明。例如,以下是相同的操作,其中一个使用 Spring 的抽象和其他使用 JCache:javax.cache.annotation.CacheKeyGeneratorKeyGenerator@CacheKeySpring中文文档

@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 操作,类似于如何 指定 .CacheKeyResolverCacheResolverFactorySpring中文文档

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

@CacheResult(cacheName="books", exceptionCacheName="failures"
			cachedExceptions = InvalidIsbnNotFoundException.class)
public Book findBook(ISBN isbn)
表 1.Spring 与 JSR-107 缓存注解
Spring JSR-107型 备注

@CacheableSpring中文文档

@CacheResultSpring中文文档

相当相似。 可以缓存特定的异常并强制 无论缓存的内容如何,都执行该方法。@CacheResultSpring中文文档

@CachePutSpring中文文档

@CachePutSpring中文文档

当 Spring 使用方法调用的结果更新缓存时, JCache 要求将其作为用 注释的参数传递。 由于这种差异, JCache 允许在 实际方法调用。@CacheValueSpring中文文档

@CacheEvictSpring中文文档

@CacheRemoveSpring中文文档

相当相似。 支持条件逐出,当 方法调用会导致异常。@CacheRemoveSpring中文文档

@CacheEvict(allEntries=true)Spring中文文档

@CacheRemoveAllSpring中文文档

看。@CacheRemoveSpring中文文档

@CacheConfigSpring中文文档

@CacheDefaultsSpring中文文档

允许您以类似的方式配置相同的概念。Spring中文文档

1 为此操作自定义工厂。
对于所有引用的类,Spring 会尝试找到具有给定类型的 bean。 如果存在多个匹配项,则创建一个新实例,并且可以使用常规实例 Bean 生命周期回调,例如依赖注入。

启用 JSR-107 支持

您无需执行任何特定操作即可与 Spring 一起启用 JSR-107 支持 声明性注释支持。和 XML 元素都会自动启用 JCache 支持 JSR-107 API 和模块都存在于类路径中。@EnableCachingcache:annotation-drivenspring-context-supportSpring中文文档

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