1.spring从3.1开始支持缓存功能。spring 自带的缓存机制它只在方法上起作用,对于你使用其他持久化层的框架来讲,是没有影响的,相对来讲这种缓存方式还是不错的选择。

2.提供缓存的接口:org.springframework.cache.Cache ;org.springframework.cache.CacheManager这两个接口都在context中,一个是用来提供缓存的,一个是用来提供管理缓存的。

3.缓存是使用键值对的形式存在的,对应Java中就要使用Map<K,V>这种数据结构来处理,推荐使用java.util.concurrent.ConcurrentMap来存放。

4.注解:

在上面的注解中我们常用到的有@Cacheable,@CacheEvict,@CachePut这3个,我们目前也只学这3个

5.

@Cacheable:用来定义缓存的。常用到是value,key;分别用来指明缓存的名称和方法中参数,对于value你也可以使用cacheName,在查看源代码是我们可以看到:两者是指的同一个东西。

@CacheEvict:用来清理缓存。常用有cacheNames,allEntries(默认值false);分别代表了要清除的缓存名称和是否全部清除(true代表全部清除)。

@CachePut:用来更新缓存,用它来注解的方法都会被执行,执行完后结果被添加到缓存中。该方法不能和@Cacheable同时在同一个方法上使用。

6.对于@Caching注解来讲,如果有两种不同的需求,都是放在同一个方法上,这种需求如果只是使用@CacheEvict或者@CachePut是无法实现,因为他们不能多样化的作用在同一个方法上。可以使用@Caching(evict={@CacheEvict(“a1”),@CacheEvict(“a2”,allEntries=true)});@Caching源代码如下:

7.下面我们来看看CacheManager这个接口,源代码如下:

不难看出,最终目的还是用来获取Cache这个对象的,而我们缓存的数据都放在Cache中,部分源代码如下:

8.上面的一些基本的东西都已说完,下面看看怎么配置,让缓存真正的起作用:

来看看官方文档给的写法,里面重要的是spring-cache.xsd

其中的注解添加完,你就可以中代码中使用了:

在使用spring中缓存时,我们一般选择SimpleCacheManager这个类。

SimpleCacheManager源代码如下:

可以看出我们需要配置caches这个属性,来看看官方文档的例子吧,在xml中添加如下代码:创建了两个缓存的名称一个是books 一个是 default,我们可以只创建一个。

但是set中我们因该怎么写,在文章开头我们提到了ConcurrentMap这个类,再看下下面的红框中,我们选择一个,其中看其源代码可知道ConcurrentMapCacheFactoryBean内容包含其他两个。所有我们选择这个。

其源代码如下:

9.现在基本的配置都完成,现在就需要配置自己的bean去做下测试了。

编写一个逻辑处理的类,把该类放在xml定义:

public class TestCacheService {
//通过参数name
@Cacheable(cacheNames="uCache",key="#name")
public User get(String name){
User u = new User();
u.setAge(12);
u.setUserName("jobs");
System.out.println("没有缓存"+name);
return u;
}
//通过方法名
@Cacheable(value="uCache",key="#root.methodName")
public User get2(){
User u = new User();
u.setAge(12);
u.setUserName("gate");
System.out.println("没有缓存");
return u;
}
}

编写一个测试类

public class TestCache {

    public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config/spring-cache.xml");
TestCacheService testCache = (TestCacheService)context.getBean("testCache");
testCache.get("jobs");
testCache.get("jobs");
    }
}

运行测试一下,会发现报错,原因是xml中的p:name没有绑定:

在xml中添加:xmlns:p="http://www.springframework.org/schema/p"就可。

测试结果只有一行被打印处理,说明我们的缓存起作用了。

10.如何从缓存中提取缓存的数据:

首先我们要知道怎么从缓存中提取已经缓存过的数据:

public class TestCache {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config/spring-cache.xml");
TestCacheService testCache = (TestCacheService)context.getBean("testCache");
CacheManager cm = (CacheManager) context.getBean("cacheManager");
//添加数据到缓存中
testCache.get("job");
Cache uCache = cm.getCache("uCache");
//通过参数作为key,得到对应的value
User u1 = (User) uCache.get("job").get();
u1.show();
//添加数据到缓存中
testCache.get2();
//通过方法名作为key,得到对应value
User u2 = (User) uCache.get("get2").get();
u2.show();
}
}

当然还有其他形式作为其key,类如官方文档就给了如下参考,它是使用spel:

 

 

当让还有其它的缓存技术,例如ehcache,guava,jcache:

这个是我例子中用到的源代码:spring缓存技术Caching例子

 

spring中的缓存--Caching的更多相关文章

  1. 分布式数据存储 之 Redis(二) —— spring中的缓存抽象

    分布式数据存储 之 Redis(二) -- spring中的缓存抽象 一.spring boot 中的 StringRedisTemplate 1.StringRedisTemplate Demo 第 ...

  2. spring中使用缓存

    一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...

  3. spring中配置缓存—ehcache

    常用的缓存工具有ehcache.memcache和redis,这里介绍spring中ehcache的配置. 1.在pom添加依赖: <!-- ehcache 相关依赖 --> <de ...

  4. redis—Spring中redis缓存的简单使用

    这里使用的是 Spring-4.3 , redis-2.8 的版本   1.添加maven依赖 <dependency> <groupId>redis.clients</ ...

  5. 在Spring中使用cache(EhCache的对象缓存和页面缓存)

    Spring框架从version3.1开始支持cache,并在version4.1版本中对cache功能进行了增强. spring cache 的关键原理就是 spring AOP,通过 spring ...

  6. Spring MVC 中的http Caching

    文章目录 过期时间 Last-Modified ETag Spring ETag filter Spring MVC 中的http Caching Cache 是HTTP协议中的一个非常重要的功能,使 ...

  7. 浅析redis缓存 在spring中的配置 及其简单的使用

    一:如果你需要在你的本地项目中配置redis.那么你首先得需要在你的本地安装redis 参考链接[http://www.runoob.com/redis/redis-install.html] 下载r ...

  8. spring(三、spring中的eheche缓存、redis使用)

    spring(三.spring中的eheche缓存.redis使用) 本文主要介绍为什么要构建ehcache+redis两级缓存?以及在实战中如何实现?思考如何配置缓存策略更合适?这样的方案可能遗留什 ...

  9. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

随机推荐

  1. Adroid—— DVM

     Android DVM   Android 运行环境主要指的虚拟机技术——Dalvik.Android中的所有Java程序都是运行在Dalvik VM上的.Android上的每个程序都有自己的线程, ...

  2. VB.NET &amp; 策略模式(下机用户类型选择)

    上篇文章讲述了对于下机操作和基本数据设定的时间联系,今天主要就是应用"策略模式"来了解了解对于固定用户,以及暂时用户之间的选择,看学习设计模式的时候自己对于策略模式的理解,我们能够 ...

  3. 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务

    Eureka 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务.由两个组件组成:Eureka服务器和Eureka客户端.Eureka服务器用作服务注册服务器.Eureka ...

  4. 【cf492】E. Vanya and Field(拓展欧几里得)

    http://codeforces.com/contest/492/problem/E 一开始没时间想,,诶真是.. 挺水的一道题.. 将每个点的横坐标都转换成0,然后找纵坐标有多少即可..即解方程 ...

  5. Git神器sourceTreesetup,让你的git效率迅速提升

    image.png 小编之前在简书和公众号发不过idea如何git clone,git add,创建分支,创建码云的操作idea和Webstorm上使用git和github,码云最近又找到一款git神 ...

  6. (转)session、cookie与“记住我的登录状态”的功能的实现

    Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...

  7. JavaWeb的编码问题

    http://blog.csdn.net/yuhaiqiang_123/article/details/51811419

  8. win10 设置C盘访问权限

    “以管理员身份运行” cmd.exe C:\Windows\system32>icacls "C:\Program Files\Epic Games" /setintegri ...

  9. 通过Servlet获取初始化参数

    获取初始化参数在web.xml中配置Servlet时,可以配置一些初始化参数.而在Servlet中可以通过ServletConfig接口提供的方法来获取这些参数.(其实还可以通过ServletCont ...

  10. 《转》武​汉​的​I​T​公​司

    本文转载自sherry020406前段时间看到版上有同学问在武汉找工作的情况,我谈谈去年找工作时碰到或者听到的一些企业,希望以下内容对想去武汉工作的同学有帮助,也算是对job版的回报.有些公司的情况可 ...