资讯专栏INFORMATION COLUMN

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

fengxiuping / 790人阅读

摘要:注解从版开始,的缓存抽象完全支持标准注解和以及和。使用方法调用的结果更新缓存,要求将其作为使用注解的参数传递给它由于这种差异,允许在实际方法调用之前或之后更新缓存。非常相似,当方法调用导致异常时,支持条件驱逐。

JCache(JSR-107)注解

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

特性摘要

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

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。

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:

@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支持。

根据你的用例,选择基本上是你自己的,你甚至可以在某些服务上使用JSR-107 API并在其他服务上使用Spring自己的注解来混合和匹配服务。但是,如果这些服务影响相同的缓存,则应使用一致且相同的键生成实现。
上一篇:声明式基于注解的缓存

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76180.html

相关文章

  • SpringBoot 实战 (十一) | 整合数据缓存 Cache

    摘要:前言如题,今天介绍的数据缓存。说明确实做了数据缓存,第二次的测试结果是从数据缓存中获取的,并没有直接查数据库。为为的数据做了缓存插入数据返回的结果数据库中的结果访问结果如下图。后语以上为数据缓存的教程。 微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。 前言 如题,今天介绍 SpringBoot 的数据缓存。做过开发的都知道程序的瓶颈在于数据库,我们也知道内...

    idealcn 评论0 收藏0
  • 阿里巴巴开源的通用缓存访问框架JetCache介绍

    摘要:是由阿里巴巴开源的通用缓存访问框架,如果你对很熟悉的话,请一定花一点时间了解一下,它更好用。有了,我们就可以更方便的基于统一的接口访问缓存。 JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。 JetCache提供的核心能力包括: 提供统一的,类似jsr-107风格的API访问Cache...

    vpants 评论0 收藏0

发表评论

0条评论

fengxiuping

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<