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 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...
随机推荐
- input checkbox 选中问题
对html控制不熟的人,估计被checkbox的选中问题发愁了,因为input的checkbox只有选中属性 checked='checked' 但是它有另外一个规则就是Request的时候 只有选中 ...
- CSS(七):浮动
一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...
- nginx的root alias 指令
location /img/ { alias /var/www/image/; } #若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 ...
- zabbix 监控 AWS-SQS 队列
zabbix-AWS_SQS-monitor AWS SQS status monitor with zabbix zabbix通过 AWS 云 api 自动发现.监控 AWS-SQS 本版本数据的图 ...
- HDU 1284 钱币兑换问题(全然背包:入门题)
HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...
- 在CentOS上安装Java环境
如何使用yum方式在CentOS上安装Java环境,系统以CentOS6.4为例. 工具/原料 Java JDK yum库 CentOS6.4 方法/步骤 1 查看CentOS自带JDK是否已安装. ...
- angular使用codemirror ui-codemirror在模态框或者tab中没有缩进,内容也会在点击之后才显示的问题
<textarea ui-codemirror="{ mode: 'javascript', lineNumbers: true, theme: 'solarized dark', l ...
- UESTC 1511(差分约束)
题目链接:http://acm.uestc.edu.cn/problem.php?pid=1511 思路:我们可以等到这样的5个关系式: k=1:dsit[a]-dist[b]>=0&& ...
- Angular ViewChild
viewchild // 使用方法 git clone https://git.oschina.net/mumu-osc/learn-component.git cd learn-component ...
- maven + hessian 简单样例
项目结构例如以下: pom.xml 内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...