复制过来时的地址:http://blog.csdn.net/xiaoyu411502/article/details/48901555
2016-07-17 00:08 446人阅读
评论(0)
收藏 举报

分类:
Spring Boot
(54) 
Spring
(16)
Spring Cache
Spring
Cache使用方法与Spring对事务管理的配置相似。Spring
Cache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返回。所以在使用Cache的时候我们要保证我们缓存的方法对于相同的参数要有相同的返回结果。
-----------Spring对Cache的支持有两种方法:
1.基于注解的配置
2.基础XML配置
-----------------------------------------------------通过注解去使用到Cache------------------------------------------
@Cacheable-------使用这个注解的方法在执行后会缓存其返回结果。
@CacheEvict--------使用这个注解的方法在其执行前或执行后移除Spring Cache中的某些元素。
---------------------------------------@Cacheable----------------------------
@Cacheable可以注解在方法上也可以注解在类上。当标记在方法上面时,表示该方法是可以缓存的;如果标记在类上面,则表示该类的所有方法都是可以缓存的。对于一个支持缓存的方法,在执行后,会将其返回结果进行缓存起来,以保证下次同样参数来执行该方法的时候可以从缓存中返回结果,而不需要再次执行此方法。Spring缓存方法的返回值是以键值对进行保存的,值就是返回结果,键的话Spring支持两种策略,一种是默认策略,一种是自定义策略。
注意:一个支持缓存的方法,在对象内部被调用是不会触发缓存功能的。
@Cacheable可以指定三个属性:value、key、condition。
----------------------value:指定Cache的名称
value值是必须指定的,其表示该方法缓存的返回结果是被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以使多个Cache(数组);
- @Cache"Cx"//Cache是指定在Cx上面的 或者指定多个@Cache(value={"Cx","Cx1"})
public
.....;
- }
-----------------------key:自定义key
key属性是用来指定Spring缓存方法返回结果时所对应的key值的。该属性支持EL表达式。当我们没有指定key时,Spring会使用默认策略生成key。·
-----------key的自定义策略:
自定义策略是表示我们通过EL表达式来指定我们的key。这里EL表达式可以使用方法参数以及他们对应的属性。使用方法参数时,我们可以使用“#参数名”。
- @Cacheable"users")
- public
}
- @Cacheable"users")
- public
}
除了上面使用方法参数作为Key以外,Spring还为我们提供了一个root对象可以生成key。通过root对象我们还可以获取到
-------1.methodName 当前方法名 #root.methodName
-------2.method 当前方法
#root.method.name
-------3.target 当前被动用对象
#root.target
-------4.targetClass 当前被调用对象Class#root.targetClass
-------5.args 当前方法参数组成的数组
#root.args[0]
-------6.caches 当前被调用方法所使用的Cache
#root.caches[0],name
当我们要使用root作为key时,可以不用写root直接@Cache(key="caches[1].name")。因为他默认是使用#root的
-----------------condition:指定发生条件
有时候可能不需要缓存一个方法的所有结果。通过condition可以设置一个条件,其条件值是使用SpringEL表达式来指定的。当为true时进行缓存处理;为false时不进行缓存处理,即每次调用该方法都会执行。
eg:
- @Cacheable"users", condition=)
这个则是当用户id为偶数的时候才会缓存。
-----------------------------------------------------@CachePut------------------------------------------
与@Cacheable不同,它虽然也可以声明一个方法支持缓存,但它执行方法前是不会去检查缓存中是否存在之前执行过的结果,而是每次都执行该方法,并将执行结果放入指定缓存中。
-----------------------------------------------------@CacheEvict----------------------------------------
@CacheEvict标注在需要清楚缓存元素的方法和类上。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。value表示清除缓存作用在哪个Cache上;key是表示需要清除的是哪个key。
--------------allEntries是表示是否需要清除缓存中所有的元素。
--------------beforeInvocation
清除操作默认是在方法成功执行之后触发的。使用beforeInvocation可以改变触发清除操作的时间,当我们设置为true时,Spring会在调用该方法之前进行缓存的清除。
------------------------------------------------------@Caching-------------------------------------------
- @Caching@Cacheable"users"@CacheEvict"cache2"@CacheEvict"cache3"true> </span>
-------------------------------------------------------自定义注解-----------------------------------------
- @Target
@Retention
@Cacheable"users"
public MyCacheable {
- }
我们在需要缓存的方法上面使用@MyCacheable可以达到同样的缓存效果。
----------------------------------------------------------------------------------------------------------------------------------------------
--------------------------配置Spring对Cache的支持
声明对Cache的支持
1.基于注解
配置Spring对注解Cache的支持,我们需要在Spring配置文件中添加Cache命名空间,然后通过<cache:anotation-driven/>
就可以启动Spring对注解Cache的支持。
其中<cache:anotation-driven/>有一个mode属性,可以选择值proxy和aspectj。默认使用proxy。当mode为proxy时,只有缓存方法在外部被调用的时候才会生效。这也就意味着如果一个缓存方法在一个对象的内部被调用SpringCache是不会发生作用的。而mode为aspectj时,就不会有这种问题了。另外使用proxy的时候,只有public方法上的@Cacheable才会发生作用。如果想非public上的方法也可以使用那么就把mode改成aspectj。
注意:当我们mode使用aspectj和proxy-target-class为true时,定义在接口上的Cache注解是无法被识别的。<cache:cache-driven/>只会去寻找定义在同一个ApplicationContext下的@Cacheable等缓存注解。
2.基于XML配置
Spring还支持使用XML文件来配置,方式和配置事务管理类似。
- <cache:advice id= cache-manager=>
- >
- key=/>
- key=/>
- all-entries=/>
- </cache:advice>
cache-manager默认是cacheManager。其中指定了将findById和find方法缓存到users中。也可以使用通配符“*”
然后在配置aop:config指定定义好的advice作用到那些地方(pointcut)
- <aop:config proxy-target-=>
- pointcut=
</aop:config>
3.配置CacheManager
CacheManager是Spring定义的一个用来管理Cache的接口。Spring自身提供了两种,一种是基于JAVA API的ConcurrentMap,另一种是基于第三方Cache实现--Ehcache。
---------------------基于ConcurrentMap的配置
- <bean id= =>
- >
- = p:name=/>
- </bean>
p:name则是我们在注解时候使用的value(也就是使用的哪个cache)。
---------------------基于Ehcache的配置
- <bean id= = p:cache-manager-ref=/>
- = p:config-location=/>
它是通过指定的ehcache配置文件来生成的一个Ehcache的CacheManager。若未指定则默认规则取classpath路径下的ehcache文件,若还是不存在则取Ehcache对应包的ehcache-failsafe.xml文件作为配置文件。
---------------------------------------------------------键的生成策略-----------------------------------------------------------
键的生成策略有两种,一种是默认策略,一种是自定义策略。
----------------------------默认策略:
默认的key是通过KeyGenerator生成的,其默认策略如下:
1.如果方法没有参数,则使用0作为key;
2.如果只有一个参数的话则使用该参数作为key;
3.如果参数多于一个则使用所有参数的hashcode作为key;
----------------------------自定义策略:
自定义策略是指我们通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用参数以及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...
- Spring缓存框架原理浅谈
运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...
- Spring4.1新特性——Spring缓存框架增强(转)
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- 使用Spring缓存的简单Demo
使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...
- spring缓存Ehcache(入门2)源码解读
Ehcache缓存: 解读: Ehcache缓存是在继承spring缓存核心类CacheManager的基础上实现的. 常用类: EhCacheCacheManager:继承自CacheManager ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)
原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- 25. Spring Boot与缓存 JSR-107、Spring缓存抽象
JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和Expiry. CachingProvider ...
随机推荐
- echarts学习网站
echarts : http://echarts.baidu.com/echarts2/doc/example.html 相关脚本学习网站:http://www.jb51.net/html/list/ ...
- 一个简单的 MVVM 实现
简介 一个简单的带有双向绑定的 MVVM 实现. 例子 使用 新建一个 ViewModel 对象, 参数分别为 DOM 元素以及绑定的数据即可. 指令 本 MVVM 的指令使用 data 数据, 即 ...
- 使用Git命令上传本地项目
前提,安装git,使用cmd进入项目根目录. 初始化git init 再添加文件git add .git commit -m '项目名' 上传项目到Github仓库git remote add ori ...
- 逻辑运算符&&和&的区别 ||和|的区别
A:最终结果一样. B:&& 和 || 有短路作用,左边是false ,右边不执行.
- Mysql的一些常用方法
公司近期为新来同事做了一次培训,我也偷偷溜进去观摩了一下,内容虽然很基础,但是还是挺有用的.这里做了一下资料汇总: 2种存储引擎 InnoDB:支持事务处理.外键.行级锁,游戏业务库使用 MyISAM ...
- python随便笔记。。。
一.input().strip(),strip()的作用是不读取用户输入的空格 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符s.lstrip(rm) ...
- Delphi JCL JEDI使用 jclDebug
开源 https://github.com/project-jedi/jcl jclDebug 下载jcl,还要下载https://github.com/project-jedi/jedi里的2个in ...
- c#-基础:类的进阶
类的概述: 类是一个能存储数据并执行代码的数据结构 数据成员:通常模拟该类所表示显示世界的事物特性 函数成员:执行代码.模拟显示世界事物的功能和操作 数据成员:字段,常量 函数成员执行代码:方法 运算 ...
- python模块学习心得
初始模块 1.什么是模块 模块是用来实现某项功能的一大堆代码,为什么会有模块呢?过程式编程的时候为了减少程序员编程代码的重复性,就利用函数的调用减少了代码的重复性,但是某些时候程序会过于的庞大,我们会 ...
- RequireJS基础(三)
这篇来写一个具有依赖的事件模块event. event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.d ...