Spring Framework 参考文档(JCache(JSR-107)注解)

JCache(JSR-107)注解

从4.1版开始,Spring的缓存抽象彻底支持JCache标准注解:@CacheResult@CachePut@CacheRemove@CacheRemoveAll以及@CacheDefaults@CacheKey@CacheValue。即便不将缓存存储库迁移到JSR-107,也可使用这些注解,内部实现使用Spring的缓存抽象,并提供符合规范的默认CacheResolverKeyGenerator实现。换句话说,若是你已经在使用Spring的缓存抽象,则能够切换到这些标准注解,而无需更改缓存存储(或配置,就此而言)。java

特性摘要

对于那些熟悉Spring的缓存注解的,下表描述了Spring注解与JSR-107版本之间的主要区别:spring

Spring JSR-107 备注
@Cacheable @CacheResult 很是类似,@CacheResult能够缓存特定的异常并强制执行该方法,而无论缓存的内容如何。
@CachePut @CachePut Spring使用方法调用的结果更新缓存,JCache要求将其做为使用@CacheValue注解的参数传递给它;
因为这种差别,JCache容许在实际方法调用以前或以后更新缓存。
@CacheEvict @CacheRemove 很是类似,当方法调用致使异常时,@CacheRemove支持条件驱逐。
@CacheEvict(allEntries=true) @CacheRemoveAll 请参阅@CacheRemove
@CacheConfig @CacheDefaults 容许你以相似的方式配置相同的概念。

JCache有javax.cache.annotation.CacheResolver的概念,它与Spring的CacheResolver接口相同,只是JCache只支持一个缓存。默认状况下,简单的实现根据注解上声明的名称检索要使用的缓存,应该注意的是,若是在注解上没有指定缓存名称,则会自动生成默认值,有关更多信息,请参阅@CacheResult#cacheName()的javadoc。segmentfault

CacheResolver实例由CacheResolverFactory检索,能够为每一个缓存操做自定义工厂,如如下示例所示:缓存

@CacheResult(cacheNames="books", cacheResolverFactory=MyCacheResolverFactory.class) 
public Book findBook(ISBN isbn)
对于全部引用的类,Spring尝试查找具备给定类型的bean,若是存在多个匹配项,则会建立一个新实例,而且可使用常规bean生命周期回调,例如依赖项注入。

键由javax.cache.annotation.CacheKeyGenerator生成,其做用与Spring的KeyGenerator相同,默认状况下,除非至少有一个参数使用@CacheKey注解,不然将考虑全部方法参数,这相似于Spring的自定义键生成声明,例如,如下是相同的操做,一个使用Spring的抽象,另外一个使用JCache:code

@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)

启用JSR-107支持

除了Spring的声明性注解支持以外,你无需执行任何特定的操做来启用JSR-107支持,若是JSR-107 API和spring-context-support模块都存在于类路径中,则@EnableCachingcache:annotation-driven元素都会自动启用JCache支持。get

根据你的用例,选择基本上是你本身的,你甚至能够在某些服务上使用JSR-107 API并在其余服务上使用Spring本身的注解来混合和匹配服务。可是,若是这些服务影响相同的缓存,则应使用一致且相同的键生成实现。

上一篇:声明式基于注解的缓存

相关文章
相关标签/搜索