原文地址 http://jinnianshilongnian.iteye.com/blog/2001040
@CachePut
应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存:
- @CachePut(value = "user", key = "#user.id")
- public User save(User user) {
- users.add(user);
- return user;
- }
即调用该方法时,会把user.id作为key,返回值作为value放入缓存;
@CachePut注解:
- public @interface CachePut {
- String[] value(); //缓存的名字,可以把数据写到多个缓存
- String key() default ""; //缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍
- String condition() default ""; //满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断
- String unless() default ""; //用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了
- }
@CacheEvict
即应用到移除数据的方法上,如删除方法,调用方法时会从缓存中移除相应的数据:
- @CacheEvict(value = "user", key = "#user.id") //移除指定key的数据
- public User delete(User user) {
- users.remove(user);
- return user;
- }
- @CacheEvict(value = "user", allEntries = true) //移除所有数据
- public void deleteAll() {
- users.clear();
- }
@CacheEvict注解:
- public @interface CacheEvict {
- String[] value(); //请参考@CachePut
- String key() default ""; //请参考@CachePut
- String condition() default ""; //请参考@CachePut
- boolean allEntries() default false; //是否移除所有数据
- boolean beforeInvocation() default false;//是调用方法之前移除/还是调用之后移除
@Cacheable
应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中:
- @Cacheable(value = "user", key = "#id")
- public User findById(final Long id) {
- System.out.println("cache miss, invoke find by id, id:" + id);
- for (User user : users) {
- if (user.getId().equals(id)) {
- return user;
- }
- }
- return null;
- }
@Cacheable注解:
- public @interface Cacheable {
- String[] value(); //请参考@CachePut
- String key() default ""; //请参考@CachePut
- String condition() default "";//请参考@CachePut
- String unless() default ""; //请参考@CachePut
运行流程
- 1、首先执行@CacheEvict(如果beforeInvocation=true且condition 通过),如果allEntries=true,则清空所有
- 2、接着收集@Cacheable(如果condition 通过,且key对应的数据不在缓存),放入cachePutRequests(也就是说如果cachePutRequests为空,则数据在缓存中)
- 3、如果cachePutRequests为空且没有@CachePut操作,那么将查找@Cacheable的缓存,否则result=缓存数据(也就是说只要当没有cache put请求时才会查找缓存)
- 4、如果没有找到缓存,那么调用实际的API,把结果放入result
- 5、如果有@CachePut操作(如果condition 通过),那么放入cachePutRequests
- 6、执行cachePutRequests,将数据写入缓存(unless为空或者unless解析结果为false);
- 7、执行@CacheEvict(如果beforeInvocation=false 且 condition 通过),如果allEntries=true,则清空所有
流程中需要注意的就是2/3/4步:
如果有@CachePut操作,即使有@Cacheable也不会从缓存中读取;问题很明显,如果要混合多个注解使用,不能组合使用@CachePut和@Cacheable;官方说应该避免这样使用(解释是如果带条件的注解相互排除的场景);不过个人感觉还是不要考虑这个好,让用户来决定如何使用,否则一会介绍的场景不能满足。
相关推荐
ehcache配置使用详解,里面有具体的例子
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。这篇文章主要介绍了Spring Boot整合EhCache的步骤详解,需要的朋友可以参考下
EHCache技术文档详解
hibernate ehcache.xml 配置详解
基于公司的项目在Spring中集成Ehcache,并提供EhcaheUtils工具类,并通过Spring的AOP编程实现方法缓存注解话,先奉献出核心代码,需要的朋友可以参考哦!
ehcache缓存配置详解 个人通过查资料和实践后总结
配置ehcache缓存,存储内存的设置,与spring 的整合等
ehcache :添加依赖 pom.xml 2、添加配置文件ehcache.xml 3、添加注解@EnableCaching @Cacheable 4、插入缓存 5 读取缓存 6 设置缓存过期时间ehcache.xml -->timeToLiveSeconds。 redis : 1、添加依赖 pom.xml 2、...
spring集成ehcache所需的jar包
1.通过google ehcache-spring-annotatios.jar自动注解方式实现整合Spring+Ehcache。 2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。...
Spring+EhCache实例源码,本实例的环境 eclipse + maven + spring + ehcache + junit,实例详解请访问博主博客:http://blog.csdn.net/u013142781
主要为大家详细介绍了Spring+EHcache缓存实例,EhCache是一个纯Java的进程内缓存框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
EHCache技术文档详解
spring整合ehcache的入门级别demo分享,通过junit来测试
spring3整合EhCache注解实例
spring整合了ehcache,实现了缓存功能。附带读取properties文件信息功能。
spring + ehcache + redis两级缓存
Spring与ehcache结合使用,本地缓存的实现
spring+ehcache示例整合Demo