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提 ...
随机推荐
- linux的文件
今日感慨:linux根目录下的文件夹含义 bin的知识,二进制文件,其用途依系统或应用而定 . 也就是说,一般来讲是机器代码,汇编语言编译后的结果,(DOS下汇编语言编译后与.com文件相类似),用d ...
- Spring3: 在Bean定义中使用EL-表达式语言
5.4.1 xml风格的配置 SpEL支持在Bean定义时注入,默认使用“#{SpEL表达式}”表示,其中“#root”根对象默认可以认为是ApplicationContext,只有Applicat ...
- JSON字符串与JSON对象的互相转换
比如工作中遇到的app强制退出功能的参数问题 首先定义一个JSON字符串 objectStr : String value=UUID.randomUUID().toString();SimpleDat ...
- Ceph配置项动态变更机制浅析
转自:https://www.ustack.com/blog/ceph%e9%85%8d%e7%bd%ae%e9%a1%b9%e5%8a%a8%e6%80%81%e5%8f%98%e6%9b%b4%e ...
- iOS自动化探索(六)自动化测试框架pytest - fixtures
Fixture介绍 fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面.在编写测试函数的时候,可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将 ...
- 使用display:inline-block产生间隙
使用display:inline-block产生间隙 一.产生的原因:当初设立标准的不是亚洲而是欧洲,inline元素为了正确显示英文字母如y j g等带有尾巴的,就在底下留空.二.解决办法: 四个d ...
- react style: 二级菜单
1.样式 @import "../../styles/varibles"; .app-sidebar { overflow: hidden; width: 180px; > ...
- 【dlbook】机器学习基础
[机器学习基础] 模型的 vc dimension 如何衡量? 如何根据网络结构衡量模型容量?有效容量和模型容量之间的关系? 统计学习理论中边界不用于深度学习之中,原因? 1.边界通常比较松, 2.深 ...
- 【python】命令行解析工具argparse用法
python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...
- Flask 的 数据库连接 与 DBUtils 数据库连接池
Flask 的 数据库连接 与 DBUtils 数据库连接池 本地线程:thread_local 为每个线程创建存储数据的空间,用于线程之间的数据隔离 否则多个线程同时访问,会使得数据混乱 1 Fla ...