Spring缓存源码剖析:(二)CacheManager
一、CacheManager总览
如果需要Spring缓存可以正常工作,必须配置一个CacheManager。
CacheManager实现类你可以配置Spring-context本身提供的SimpleCacheManager和ConcurrentMapCacheManager等。或者使用RedisCacheManager将缓存内容存放到Redis中。下面类图中RedisCacheManager来自于spring-data-redis jar包中,AbstractTransactionSupportingCacheManager来自Spring-context-support jar包中。本系列文章主要关注spring-context jar包。
二、CacheManager接口
CacheManager简单描述就是用来存放Cache,Cache用于存放具体的key-value值。举个栗子:一个Cache的名字是“奶牛厂”,那么这个Cache中可以根据“小白”获得叫做小白的奶牛,“小黑”获得叫做小黑点奶牛。
三、AbstractCacheManager抽象类
AbstractCacheManager提供了基本的操作,如果已经存在的CacheManager无法满足使用要求,可以继承AbstractCacheManager类实现自己的CacheManager。
afterPropertiesSet()方法。来自实现的org.springframework.beans.factory.InitializingBean接口,在Bean实例化之后调用。这里使用了模板方法模式,loadCaches()方法的实现交给具体的子类,大致意思就是:这里需要得到Cache的集合,具体这个Cache集合从哪里来,具体的Cache的实现类是什么一概不管。
getCache(String)方法。即根据Cache名称获取与之对应的Cache,如果没有找到对应的Cache,则会调用getMissingCache(String),默认getMissingCache返回null。将决定权交给实现者,你可以创建一个Cache,或者记录日志。
updateCacheNames(String)方法。如果getMissingCache后cache不为空,这里会调用updateCacheNames方法,更新cacheNames集合。cacheNames是一个只读的Set,每次更新需要重新创建新的Set。
lookupCache(String) 方法。根据一个Cache名称得到对应的Cache,如果没有就返回null,不会触发getMissingCache方法。
decorateCache(Cache)方法。加入getMissingCache方法创建了Cache的实例,则会调用decorateCache方法对原有的Cache进行一次包装,这个通过方法名字应该可以猜到可能会用到修饰模式(也有叫装饰模式等),这里也没有给出具体实现。
我们来看一个实现该方法的例子,就拿RedisCacheManager来看:
在RedisCacheManager中decorateCache方法直接调用父类AbstractTransactionSupportingCacheManager中的decorateCache方法,如果条件是“可感知事务的”,则会用事务的Cache修饰器类将原有的Cache实例包裹一层,增加相关操作。
Spring缓存源码剖析:(二)CacheManager的更多相关文章
- Spring缓存源码剖析:(一)工具选择
从本篇开始对Spring 4.3.6版本中Cache部分做一次深度剖析.剖析过程中会对其中使用到的设计模式以及原则进行分析.相信对设计内功修炼必定大有好处. 一.环境及工具 IntelliJ IDEA ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- 5.2 Spring5源码--Spring AOP源码分析二
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- spring jdbcTemplate源码剖析
本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...
- Django Rest Framework源码剖析(二)-----权限
一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...
- 5.2 spring5源码--spring AOP源码分析二--切面的配置方式
目标: 1. 什么是AOP, 什么是AspectJ 2. 什么是Spring AOP 3. Spring AOP注解版实现原理 4. Spring AOP切面原理解析 一. 认识AOP及其使用 详见博 ...
- Qt信号槽源码剖析(二)
大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...
- jdk源码剖析二: 对象内存布局、synchronized终极原理
很多人一提到锁,自然第一个想到了synchronized,但一直不懂源码实现,现特地追踪到C++层来剥开synchronized的面纱. 网上的很多描述大都不全,让人看了不够爽,看完本章,你将彻底了解 ...
- Spring源码剖析9:Spring事务源码剖析
转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提 ...
随机推荐
- 分享:SQL优化器简介
SQL优化是我们经常会遇到的问题,无论你是专职的数据分析人员还是全栈开发大神或者是CURD搬运工. 我们在工作中经常会听到这样的声音:“查询慢?加个索引吧”.虽然加索引并不一定能解决问题,但是这体现了 ...
- npm和git代理
npm 删除代理设置:npm config delete proxynpm config delete https-proxynpm 设置代理:npm config set proxy http:// ...
- ubuntu16.04 添加中文ibus输入法
ubuntu版本 16.04 在terminal 输入命令 sudo apt-get install ibus-pinyin sudo apt-get ibus-setup 设置 选择拼音,添加选择 ...
- appium自动化测试(二)
一. 获取应用包名和入口activity 获取应用包名和入口activity:aapt命令 aapt目录: 安卓sdk的build-tools目录下(如果要在cmd里直接运行,要配置环境变量,否则需要 ...
- st表模板
http://blog.csdn.net/insistgogo/article/details/9929103 这篇博客讲解的很详细了,求区间最大值也可以用st表,时间复杂度O(n log(n)),查 ...
- CSS3的transition和transform
CSS3中的transition和transform是制作HTML5动画一定要使用到的两个属性. 注:这篇文章不考虑兼容性,只讨论webkit核心的浏览器.所以本文的所有例子请用chrome,safa ...
- 【2018年全国多校算法寒假训练营练习比赛(第四场)- E】通知小弟(强连通缩点)
题目链接:https://www.nowcoder.com/acm/contest/76/E 题目描述 在战争时期,A国派出了许多间谍到其他国家去收集情报.因为间谍需要隐秘自己的身份, ...
- jsp和servlet学习总结
一.Jsp与servlet的区别: jsp是java代码嵌入html中,用java代码控制来html. Servlet完全是JAVA程序代码构成,用来流程控制和事务处理 jsp更擅长表现于页面显示,s ...
- notepad++去空格空行技巧
选择视图显示所有字符,替换成空的就行
- L129
Iraq Sees Spike in Water-Borne IllnessesIraqi health officials say that a health crisis stemming fro ...