spring中的缓存--Caching
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的更多相关文章
- 分布式数据存储 之 Redis(二) —— spring中的缓存抽象
分布式数据存储 之 Redis(二) -- spring中的缓存抽象 一.spring boot 中的 StringRedisTemplate 1.StringRedisTemplate Demo 第 ...
- spring中使用缓存
一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...
- spring中配置缓存—ehcache
常用的缓存工具有ehcache.memcache和redis,这里介绍spring中ehcache的配置. 1.在pom添加依赖: <!-- ehcache 相关依赖 --> <de ...
- redis—Spring中redis缓存的简单使用
这里使用的是 Spring-4.3 , redis-2.8 的版本 1.添加maven依赖 <dependency> <groupId>redis.clients</ ...
- 在Spring中使用cache(EhCache的对象缓存和页面缓存)
Spring框架从version3.1开始支持cache,并在version4.1版本中对cache功能进行了增强. spring cache 的关键原理就是 spring AOP,通过 spring ...
- Spring MVC 中的http Caching
文章目录 过期时间 Last-Modified ETag Spring ETag filter Spring MVC 中的http Caching Cache 是HTTP协议中的一个非常重要的功能,使 ...
- 浅析redis缓存 在spring中的配置 及其简单的使用
一:如果你需要在你的本地项目中配置redis.那么你首先得需要在你的本地安装redis 参考链接[http://www.runoob.com/redis/redis-install.html] 下载r ...
- spring(三、spring中的eheche缓存、redis使用)
spring(三.spring中的eheche缓存.redis使用) 本文主要介绍为什么要构建ehcache+redis两级缓存?以及在实战中如何实现?思考如何配置缓存策略更合适?这样的方案可能遗留什 ...
- 学习Spring Boot:(十九)Shiro 中使用缓存
前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...
随机推荐
- HDFS的实现机制
参考以上这张图,实际上我们客户端访问HDFS里面的内容时,并不需要真实知道内容存在于服务器的内容的真实路径,我们只需要知道一个虚拟路径就可以,比如最上面的hdfs://weekend110:9000/ ...
- php 的rabbitmq 扩展模块amqp安装
php 的rabbitmq 扩展模块amqp安装 2017年10月08日 10:34:22 阅读数:240 使用PHP开发,要使用中间队列rabbitmq, 必须要安装PHP的扩展模块amqp, 服务 ...
- JSONObject与JSONArray
最近在学习过程中用到了稍微复杂点的json数据需要将json数据解析出来,这里就截取一部分作为例子 1.JSONObject介绍 JSONObject-lib包是一个beans,collections ...
- 扫描线 - UVALive - 6864 Strange Antennas
Strange Antennas Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=87213 M ...
- 在Javascript弹出窗口中输入换行符
private void showMessage(string strMsg) { Page.RegisterStartupScript("scriptStr", "&l ...
- Spring Cloud的子项目,大致可分成两类
Spring Cloud的子项目,大致可分成两类,一类是对现有成熟框架”Spring Boot化”的封装和抽象,也是数量最多的项目:第二类是开发了一部分分布式系统的基础设施的实现,如Spring Cl ...
- final可以修饰类、属性、方法
final可以修饰类.属性.方法. 当用final修饰类的时候,此类不可被继承,即final类没有子类.这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生. 当利用final修 ...
- C语言字符数组和字符串
用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...
- Struts2漏洞利用原理及OGNL机制
Struts2漏洞利用原理及OGNL机制研究 概述 在MVC开发框架中,数据会在MVC各个模块中进行流转.而这种流转,也就会面临一些困境,就是由于数据在不同MVC层次中表现出不同的形式和状态而造成 ...
- android-修改TextView中部分文字的颜色
: