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(数组);
eg:

  1. @Cache(value="Cx")//Cache是指定在Cx上面的  或者指定多个@Cache(value={"Cx","Cx1"})
  2. public User getUser(String id){
  3. return .....;
  4. }

-----------------------key:自定义key

key属性是用来指定Spring缓存方法返回结果时所对应的key值的。该属性支持EL表达式。当我们没有指定key时,Spring会使用默认策略生成key。·
-----------key的自定义策略:
自定义策略是表示我们通过EL表达式来指定我们的key。这里EL表达式可以使用方法参数以及他们对应的属性。使用方法参数时,我们可以使用“#参数名”。
eg:

  1. @Cacheable(value="users", key="#id")
  2. public User find(Integer id) {
  3. returnnull;
  4. }
  1. @Cacheable(value="users", key="#user.id")
  2. public User find(User user) {
  3. returnnull;
  4. }

除了上面使用方法参数作为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:
  1. @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")

这个则是当用户id为偶数的时候才会缓存。


-----------------------------------------------------@CachePut------------------------------------------
与@Cacheable不同,它虽然也可以声明一个方法支持缓存,但它执行方法前是不会去检查缓存中是否存在之前执行过的结果,而是每次都执行该方法,并将执行结果放入指定缓存中。
-----------------------------------------------------@CacheEvict----------------------------------------
@CacheEvict标注在需要清楚缓存元素的方法和类上。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。value表示清除缓存作用在哪个Cache上;key是表示需要清除的是哪个key。
--------------allEntries是表示是否需要清除缓存中所有的元素。
--------------beforeInvocation
清除操作默认是在方法成功执行之后触发的。使用beforeInvocation可以改变触发清除操作的时间,当我们设置为true时,Spring会在调用该方法之前进行缓存的清除。
------------------------------------------------------@Caching-------------------------------------------
@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关注解,其中拥有属性:cacheable、put、evict。

  1. @Caching(cacheable=@Cacheable("users"),evict={@CacheEvict("cache2"),@CacheEvict(value="cache3",allEntries=true)})<span style="font-family: Arial, Helvetica, sans-serif;">    </span>

-------------------------------------------------------自定义注解-----------------------------------------
  1. @Target({ElementType.TYPE, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Cacheable(value="users")
  4. public @interface MyCacheable {
  5. }

我们在需要缓存的方法上面使用@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文件来配置,方式和配置事务管理类似。
  1. <cache:advice id="cacheAdvice" cache-manager="cacheManager">
  2. <cache:caching cache="users">
  3. <cache:cacheable method="findById" key="#p0"/>
  4. <cache:cacheable method="find" key="#user.id"/>
  5. <cache:cache-evict method="deleteAll" all-entries="true"/>
  6. </cache:caching>
  7. </cache:advice>

cache-manager默认是cacheManager。其中指定了将findById和find方法缓存到users中。也可以使用通配符“*”

然后在配置aop:config指定定义好的advice作用到那些地方(pointcut)
  1. <aop:config proxy-target-class="false">
  2. <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* com.xxx.UserService.*(..))"/>
  3. </aop:config>

3.配置CacheManager
CacheManager是Spring定义的一个用来管理Cache的接口。Spring自身提供了两种,一种是基于JAVA API的ConcurrentMap,另一种是基于第三方Cache实现--Ehcache。
---------------------基于ConcurrentMap的配置
  1. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
  2. <property name="caches">
  3. <set>
  4. <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="xxx"/>
  5. </set>
  6. </property>
  7. </bean>

p:name则是我们在注解时候使用的value(也就是使用的哪个cache)。

---------------------基于Ehcache的配置
  1. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheManager"/>
  2. <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache-spring.xml"/>

它是通过指定的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 Cache使用详解的更多相关文章

  1. Spring Cache抽象详解

    缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...

  2. 转:Spring Cache抽象详解

    缓存简介 缓存,我的理解是:让数据更接近于使用者:工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数据(数据也会存入缓存):缓存什么:那些经常读取且不经常修改的数据/那些昂贵(CPU/I ...

  3. spring Cache注解详解

    @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置.在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容 ...

  4. Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  5. (转)Spring JdbcTemplate 方法详解

    Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...

  6. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  7. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  8. Spring Boot异常处理详解

    在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...

  9. spring事务配置详解

    一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...

随机推荐

  1. [转]eclipse借助hibernate tool从数据库逆向生成Hibernate实体类

    如何从数据库逆向生成Hibernate实体类呢??? 1. 首先,要在eclipse中采用自带的数据库管理器(Data Management),连通你的数据库: 然后选择数据库,这里用的oracle, ...

  2. shell命令基础

    1.修改密码 使用 passwd 命令修改密码. 该命令如果在 root 用户下执行,则修改的是 root 用户的密码. 2.获取帮助 使用 ls --help 命令获取帮助. [zhanghuiju ...

  3. LDAP验证用户名和密码

    测试环境:VS2008, NET Framework 3.5 公司打算改用LDAP来存储用户名和密码,现在用C#测试下如何能拿到LDAP中的用户名,并检测用户密码是否正确.即输入用户名和密码,可以检验 ...

  4. .Net Mvc4 Kendo Grid Demo

    看见人家项目中用到了Kendo Grid组件,感觉不错,于是就没有压制住自己内心的好奇心!嘿嘿,咱们开始吧,步骤很简单,理解起来也很容易. 首先我们创建一个空的ASP.NET MVC 4 Web 应用 ...

  5. Hadoop 架构初探

    对流行Hadoop做了一些最基本的了解,暂时没太大感觉,恩先记点笔记吧. = = Hadoop 基本命令及环境安装 一.下载虚拟机镜像 目前比较流行的有以下三个: (CHD) http://www.c ...

  6. SQL 语句优化—— (二) 索引的利用

    索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.与书中的索引一样,数据库中的索引使您可以快速找到表或索引视图中的特定信息.索引包含从表或视 ...

  7. UITextField 光标的位置设置获取

    UITextField 光标的位置设置获取 通过给UITextField 加一个拓展 //#import "UITextField+ExtentRange.h" #import & ...

  8. iOS开发篇-AFNetworking 上传和下载

    最近用到了关于AFNetworking的上传和下载问题,顺便写到博客中,以供大家参考和研究. //下载NSURLSessionConfiguration *configuration = [NSURL ...

  9. 红豆带你从零学C#系列之:开始C#编程(一)

    让我们开始学习C#编程吧 作者:红豆西米露 交流QQ:937802080 前面的文章里给大家介绍了C#语言的一些基本认识,现在我们来开始做一个小程序吧! 在这里以我们以“控制台应用程序”来作演示. P ...

  10. IOS自学笔记1——学前准备

    函数的声明和定义: 在标准的C编译器中,定义的函数只能调用前面已经定义的函数.若在main()函数里要调用其他方法,这时得首先在main()上面声明要调用的函数,即函数的声明. C语言中,函数的声明和 ...