spring使用@Cache的简单实现

基于xml的配置感觉没有注解形式简单明了,咱不考虑了。

进入正题之前先提个疑问,希望知道的人能告诉一下

下述介绍会有这段代码:

@Cacheable(value="myCache", key="‘get‘+#userNo")
        public String get(String userNo){  此处#userNo会动态的传入?

1,spring配置文件

<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
        <property name="cacheSpecification" value="initialCapacity=512,maximumSize=4096,concurrencyLevel=16,expireAfterAccess=360s" />
 </bean>

<!-- 启用缓存注解功能 -->
 <cache:annotation-driven order="1" cache-manager="cacheManager" proxy-target-class="true" />

@参考文章1里提供了SimpleCacheManager进行的配置

2,类中使用缓存

@参考文章1里写的比较好,不自己写代码了,直接复制粘贴


 package com.jadyer.service;  

    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;  

    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;  

    /**
     * Cacheable注解负责将方法的返回值加入到缓存中
     * CacheEvict注解负责清除缓存(它的三个参数与@Cacheable的意思是一样的)
     * @see ----------------------------------------------------------------------------------------------------------
     * @see value------缓存位置的名称,不能为空,若使用EHCache则其值为ehcache.xml中的<cache name="myCache"/>
     * @see key--------缓存的Key,默认为空(表示使用方法的参数类型及参数值作为key),支持SpEL
     * @see condition--只有满足条件的情况才会加入缓存,默认为空(表示全部都加入缓存),支持SpEL
     * @see ----------------------------------------------------------------------------------------------------------
     * @see 该注解的源码位于spring-context-3.2.4.RELEASE-sources.jar中
     * @see Spring针对Ehcache支持的Java源码位于spring-context-support-3.2.4.RELEASE-sources.jar中
     * @see ----------------------------------------------------------------------------------------------------------
     * @create Oct 3, 2013 6:17:54 PM
     * @author 玄玉<http://blog.csdn.net/jadyer>
     */
    @Service
    public class UserService {
        private Map<String, String> usersData = new ConcurrentHashMap<String, String>();  

        public UserService(){
            System.out.println("用户数据初始化..开始");
            usersData.put("2", "玄玉");
            usersData.put("3", "我的博客:http://blog.csdn.net/jadyer");
            System.out.println("用户数据初始化..完毕");
        }  

        //将查询到的数据缓存到myCache中,并使用方法名称加上参数中的userNo作为缓存的key
        //通常更新操作只需刷新缓存中的某个值,所以为了准确的清除特定的缓存,故定义了这个唯一的key,从而不会影响其它缓存值
        @Cacheable(value="myCache", key="‘get‘+#userNo")
        public String get(String userNo){
            System.out.println("数据库中查到此用户号[" + userNo + "]对应的用户名为[" + usersData.get(userNo) + "]");
            return usersData.get(userNo);
        }  

        @CacheEvict(value="myCache", key="‘get‘+#userNo")
        public void update(String userNo){
            System.out.println("移除缓存中此用户号[" + userNo + "]对应的用户名[" + usersData.get(userNo) + "]的缓存");
        }  

        //allEntries为true表示清除value中的全部缓存,默认为false
        @CacheEvict(value="myCache", allEntries=true)
        public void removeAll(){
            System.out.println("移除缓存中的所有数据");
        }
    }  


上述参考文章没有讲到的部分知识点,从@参考文章2找了些资料做补充

@Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

   @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),

         @CacheEvict(value = "cache3", allEntries = true) })

   public User find(Integer id) {

      returnnull;

   } 

在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

       @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

   @CachePut("users")//每次都会执行方法,并将结果存入指定的缓存中

   public User find(Integer id) {

      returnnull;

   } 

上述2步骤后,就可以愉快的使用了!~
时间: 2024-07-29 10:12:01

spring使用@Cache的简单实现的相关文章

Spring security oauth2最简单入门环境搭建

关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+spring mvc+spring security+Oauth2基本姿势,如果前面都没看过请及时关闭本网页. 我有信心我的这个blog应该是迄今为止使用spring security oauth2最简单的hello world app介绍了,如果你下下来附件源码还看不懂,请留言.. 其他能搜到的如h

Spring使用Cache、整合Ehcache

从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回.所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果. 使用Spring Cache需要我们做两方面的事: n  声明

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

Spring面向切面 --- AspectJ --- 简单使用

Spring面向切面 --- AspectJ --- 简单使用 昨天回复说说的时候突然写下了下面的一段话:分享一下: <!--******************************************* 其实经过的记忆是可以进行道德化的篡改的,就像夏目漱石的<我是猫>:但是不管怎么改,真正的事实是由每一个人的碎片拼起来的:经济学里计算成本的是在计算将来的成本而不是过去的成本,就像动漫<未来日记>一样:过去发生的事情总是在影响着将来,但是过去发生的事情却不能充当将来下

菜鸟学SSH(十三)——Spring容器解析及简单实现

最近一段时间,"容器"两个字一直萦绕在我的耳边,甚至是吃饭.睡觉的时候都在我脑子里蹦来蹦去的.随着这些天一次次的交流.讨论,对于容器的理解也逐渐加深.理论上的东西终归要落实到实践,今天就借助Spring容器实现原理,简单说说吧. 简单的说,Spring就是通过工厂+反射将我们的bean放到它的容器中的,当我们想用某个bean的时候,只需要调用getBean("beanID")方法. 原理简单介绍: Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的

spring redis cache使用思考

项目中使用spring redis cache做为cache客户端. spring redis cache中RedisCache是整个spring cache的领域模型,对应一个cache块的操作类. RedisCache中定义了put,get,clean,evict操作. 其中clean方法用于清除当前cache块中所有的元素,这里会加锁,而锁的实现是往redis服务器上存放一个key为:cache块名称加上~lock的元素.最后清除锁则是在clean方法执行完成后在finally中清除. p

Spring MVC +MyBatis +MySQL 简单的登录查询 Demo 解决了mybatis异常

忙活了大半天,饭也没顾得上吃,哎许久不动手,一动手就出事,下面请看今天的重头戏,额吃个饭回来再发了! 1.整体结构 2.准备工作 数据库: --Mysql 5.6 创建数据库 wolf CREATE DATABASE wolf; 创建用户表 user create table user( id int  AUTO_INCREMENT  primary key, name varchar(25) not null, pwd varchar(20) not null, create_time dat

spring使用cache

考虑两方面: i) 声明某些方法使用缓存(注解方式) ii) 配置Spring对Cache的支持. 一.基于注解的支持 一般我们常用的注解:@Cacheable和@CacheEvict. 1.1.@Cacheable @Cacheable既可以标记在一个方法上,也可以标记在一个类上.当标记在一个方法上时表示该方法是支持缓存的,当标记一个类上时则表示该类所有的方法都是支持缓存的. 它有三个属性:value.key和condition 1.value属性(必须的) 指定Cache名称,其表示当前方法

【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 最近一直在和容器打交道,甚至前面的博文,我们也