spring cache annotation(二)
1.@CachePut注解
当缓存需要在不干扰方法执行的情况下被更新,我们使用该注解.
方法总是会被调用,它的结果会替换缓存钟得值(根据 @CachePut的选项). 注解提供了类似@Cacheable的选项,并且它应该被用来填充缓存而不是优化方法流程.
下面是使用方法
1 2 |
@CachePut(cacheNames="book", key="#isbn") public Book updateBook(ISBN isbn, BookDescriptor descriptor) |
强烈反对在同一个方法上使用 @CachePut和@Cacheable.因为他们是不同的行为.后者导致使用缓存而跳过方法调用,前者又会调用方法更新缓存.这导致了异常的行为, 除了一些特殊案例(比如注解有排除彼此的条件),应当被避免. 另外这些条件应该避免依赖 结果对象(#result 变量),因为他们是预先验证的,以确保排除
2.@CacheEvice 注解
缓存抽象不仅可以存储缓存也可以删除缓存. 在数据不再使用或者过期的时候删除缓存.强烈反对同事使用 @Cacheable和@CacheEvict.
@CacheEvice需要指定一个或者多个需要操作的缓存,允许指定一个自定义缓存和key resolution或者一个条件.对于这个注解 有个额外的参数(allEntries),用来指定一个缓存范围删除而不是仅仅一个缓存实体(基于key).
1 2 |
@CacheEvict(cacheNames="books", allEntries=true) public void loadBooks(InputStream batch) |
上面的例子 使用 allEntries=true 来删除所有在缓存中的实体.
这个选项在需要清除整个缓存区域的时候非常方便.对比每个清除每个实体(耗时,效率低),上面的操作,所有实体通过一个操作被删除.这种场景下框架会忽略所有的键指定.
当然我们可以指定缓存是在方法调用后(默认)还是方法调用前删除,通过 beforeInvocation。
当值为false时,方法没有执行(也许被缓存了)或者抛出了一个异常,缓存将不会被删除.
反之则永远会被执行,这在缓存不需要和方法绑定时很有用.
注意的是 无返回值的方法也可以使用 @CacheEvict.
3.@Caching 注解
有时需要指定多个同一个类型的注解(比如@CacheEvict 或者 @CachePut),比如一些条件或者key表达式在不同缓存之间不同.@Caching 允许多个注解嵌套在一个方法上
1 2 |
@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") }) public Book importBooks(String deposit, Date date) |
4.@CacheConfig 注解
通过这个注解,我们可以将一些配置在所有类操作上的繁琐操作简化.
比如:
1 2 3 4 5 6 |
@CacheConfig("books") public class BookRepositoryImpl implements BookRepository { @Cacheable public Book findBook(ISBN isbn) {...} } |
通过注解我们定义了相同的缓存.
@CacheConfig是一个 允许共享缓存名称的类级别的注解,可以定义 KeyGenerator,CancheManager和CacheResolver。
将该注解放到类上并不会打开任何缓存操作.
一个操作级别的定制会覆盖 @CacheConfig的自定义集合.因此给出三个级别的定制:
- 全局配置, 对 CacheManager,KeyGenerator可用
- 类级别,使用@CacheConfig
- 操作级别
方法可见度和缓存注解
当我们使用代理的时候,应该在public 方法上使用缓存注,如果你在protected,private,或者package可见度下使用注解,不会有异常,但是已配置的缓存配置不会生效. 使用AspectJ如果你使用 非public方法,因为它可以从字节码改变.
Spring推荐,用@Cache*注解 注解在正确的类(或者正确的类方法上), 反对注释到接口上.当然我们能够 把@Cache*注解放到接口或者接口的方法上 ,但是这只能在你使用基于接口的代理上工作. 事实上java注解不能够继承接口意味着如果我们使用的基于类的代理(proxy-target- class="true") 或者基于aspect(mode="aspectj"),缓存设置不会被代理和编织的基础构建认出,这样对象就没有被缓存代理给修饰。
5.自定义注解
自定义注解和 A spectJ
这个功能是基于代理完成的,也可以通过使用Aspectj做一些额外的工作来开启. spring-asepcts 模块仅为标砖注解定义了一个切面.如果需要定义自己的注解,需要为了这个自己定义一个切面。 参考 AnnotationCacheAspect
缓存抽象可以让我们使用自己的注解来定义哪些方法需要触发放入或移除. 作为一个模板机制是非常便利的, 可以去掉重复的注解声明,特别是在key或者条件的指定或者代码库不允许外部引用(org.springframework)。 于其他的sterotype注解类似,可以使用@Cacheable,@CachePut,@CacheEvict,和@CacheConfig 来作为 元注解(meta-mannotations).
1 2 3 4 5 |
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) @Cacheable(cacheNames = {"coffees","coffees2"}, key = "#name") public @interface CoffeeCache { } |
上面的例子用公用的@Cacheable声明在自定义的注解上.
接下来就可以改变代码的注释
1 2 3 4 |
@Cacheable({"coffees","coffees2"}) public List<Coffee> findAllCoffee() { return coffeeRepository.findAll(); } |
即使@CoffeeCache不是Spring原生注解,我们也能够被容器在runtime中发现并且理解它的意思. 但是annotation-driven 的行为必须被启用.
1 2 3 4 |
@CoffeeCache public List<Coffee> findAllCoffee() { return coffeeRepository.findAll(); } |
spring cache annotation(二)相关推荐
- java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/55/ 系统 ...
- SpringBoot第十三篇:springboot集成spring cache
本文介绍如何在springboot中使用默认的spring cache, 声明式缓存 Spring 定义 CacheManager 和 Cache 接口用来统一不同的缓存技术.例如 JCache. E ...
- 学习笔记:cache 和spring cache 技术(1)
title: 学习笔记:cache 和spring cache 技术(1) author: Eric liu tags: [] categories: hexo 缓存是实际工作中非常常用的一种提高性能 ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
概述 完整示例 pomxml增加依赖 数据库表数据Oracle 实体类 服务层 ehcache的配置文件 Spring-EhCache配置文件 单元测试 日志输出 日志分析 示例源码 概述 首先请阅读 ...
- Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)
概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...
- Spring Cache抽象-使用Java类注解的方式整合EhCache
概述 工程结构 源码 概述 Spring Cache抽象-之缓存注解这篇博文中我们介绍了SpringCache抽象注解的使用方式 既然这是一个抽象,我们需要一个具体的缓存存储实现.比价流行的有:基于J ...
- Spring Cache抽象-缓存注解
文章目录 概述 Spring缓存的基本原理 @Cacheable :主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 键生成器 带条件的缓存 @Cacheable 注解参数说明 示例-缓存管理 ...
最新文章
- 2016/08/27 What I Learned About Going Fast at eBay and Google
- 与 SENet 互补提升,华为提出自注意力新机制:Weight Excitation
- robot framework安装
- Spring cloud整合zookeeper
- CF983B XOR-pyramid
- java jml_JML 入门
- iTunes 安装ipa文件到iPhone上
- A Simple Math Problem 矩阵打水题
- 美联社:两家美国域名注册公司退出中国市场
- InDesign 2022 for mac排版布局和页面设计
- 安装配置maven时因Java版本问题报错JAVA_HOME environment variable is not defined correctly
- Apache Tomcat 文件包含漏洞(CNVD-2020-10487)修复方法
- Java POI 设置字体下划线、方框打勾、字体加粗
- 新手进阶建模 (写论文摘要和看论文)
- android6.0修改默认dns
- 功率放大电路和电压放大电路的区别是什么意思
- 陕西省西安市谷歌高清卫星地图下载
- html盒子模型的实例,html盒模型的示例分析
- c语言如何判断字符json,全面详解C语言使用cJSON解析JSON字符
- EDG夺冠时刻,微帧助力虎牙打造极佳观看体验
热门文章
- Java微信公众号开发之初步认识微信公众平台
- Linear Algebra with Sub-linear Zero-Knowledge Arguments学习笔记
- Revit二次开发_1.过滤器笔记篇
- 使用自己的ISO文件制作PE
- python seek函数whence_file.seek(offset[, whence])
- mac os 安装 s2geometry + pywarps2
- 计算机efs加密,2分钟让你学会电脑EFS文件加密
- 路由的query参数
- 8.openCV 裁剪图像
- 一个小蜜蜂游戏的源代码