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:

[java] view plaincopy print?
  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:

[java] view plaincopy print?
  1. @Cacheable(value="users", key="#id")
  2. public User find(Integer id) {
  3. returnnull;
  4. }
[java] view plaincopy print?
  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:
[java] view plaincopy print?
  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。

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

-------------------------------------------------------自定义注解-----------------------------------------
[java] view plaincopy print?
  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文件来配置,方式和配置事务管理类似。
[java] view plaincopy print?
  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)
[java] view plaincopy print?
  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的配置
[java] view plaincopy print?
  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的配置
[java] view plaincopy print?
  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”。

转载于:https://www.cnblogs.com/duyinqiang/p/5696309.html

Spring Cache使用详解相关推荐

  1. Spring cache 注解详解

    spring cache注解的使用: @CacheConfig 类级别的缓存注解,允许共享缓存名称 @Caching 将多种缓存操作分组 @Cacheable 触发缓存入口 @CacahePut 更新 ...

  2. Spring Cache 注解详解

    @CacheConfig:在类上面统一定义缓存的名字,方法上面就不用标注了,表示该类所有的方法都是支持缓存的,我们一般不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义. @Cach ...

  3. 开启注解缓存_Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

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

  4. spring2.0和spring2.5及以上版本的jar包区别 spring jar 包详解

    spring jar 包详解 spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环 ...

  5. 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解

    <深入理解 Spring Cloud 与微服务构建>第十六章 Spring Boot Security 详解 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  6. Spring和Spring Mvc整合详解

    Spring和Spring Mvc整合详解 官方主页 Spring Spring Mvc SpringMvc 5,可以参考这一篇<Spring和Spring Mvc 5整合详解> 概述 S ...

  7. Spring循环依赖详解

    Spring循环依赖详解 什么是循环依赖 spring是如何解决循环依赖 循环源码分析 getSingletion方法 getSingleton spring开启代理对象的地方 循环依赖的限制条件 什 ...

  8. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  9. Spring Boot 配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> 第二篇 : Spring Boot配置文件详解 文章首发于微信公众号<程序员果果> 地址:https://mp.w ...

最新文章

  1. java框架三层架构是_MVC框架模式和Javaweb经典三层架构
  2. 华为如何拍火烧云_华为手机拍照功能介绍-设置通用功能
  3. KTV歌曲推荐-深入浅出协同过滤
  4. Could not retrieve transaction isolation level from server
  5. thymeleaf引用html_SpringBoot+Thymeleaf实现html文件引入(类似include功能)_html/css_WEB-ITnose...
  6. 没有mysql支持时的替代方案
  7. java 生成素数_java – 素数生成器逻辑
  8. FFmpeg源代码简单分析:avformat_close_input()
  9. resin 配置 java_home_resin的安装与配置 - chencheng-linux的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. C++并发与多线程(三)单例设计模式与共享数据分析、call_once、condition_variable使用
  11. 2008服务器系统c盘清理,WindowsServer2008清理C盘空间
  12. 本地文件搜索神器 --- Everything软件,快速搜索本地磁盘上的文件
  13. TWS耳机什么值得买?入耳式蓝牙耳机排行榜10强!
  14. laravel中artisan工具(命令)的使用详解
  15. 微信小程序评分功能(一)
  16. Win7自动登录,免密码
  17. 简单线性回归Ridge的应用及画图(二)
  18. Kafka3.0.0单机安装及简单使用
  19. jieba和wordcloud红楼梦人物出现次数生成词云
  20. sql 三个表联合查询(三表左联查询)

热门文章

  1. 有哪些关于iPhone使用的小技巧?
  2. 去越南旅游一个人玩一个月需要多少人民币?
  3. 冲锋衣和羽绒服哪个保暖?
  4. 有多少人欠网贷,往后的日子你打算怎么过?
  5. 映日荷花别样红是什么季节,映日荷花别样红的上一句是什么?全诗赏析
  6. 躺赚的意思不是做到高级别就觉得高枕无忧了
  7. 为什么很多人只提苹果手机比安卓手机流畅耐用,却不提苹果手机比安卓手机贵几倍?
  8. 新买的手机一直没有更新系统,是不是新买的手机原装系统最好用啊?
  9. As we all know, Java 8 provides many new features
  10. Qt——P26 Label控件显示图片