从本篇开始对Spring 4.3.6版本中Cache部分做一次深度剖析。剖析过程中会对其中使用到的设计模式以及原则进行分析。相信对设计内功修炼必定大有好处。

一、环境及工具

  IntelliJ IDEA 2016.2

  JDK 1.8

MacOS

二、测试用代码

  目录整体结构是这个样子:

  

BeanConfig 类,注册CacheManager以及扫描包下的Bean。
import com.studyspring.constants.CacheConstants;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import java.util.ArrayList;
import java.util.List; /**
* Created by zhangmingbo on 2/23/17.
*/ @EnableCaching
@Configuration
@ComponentScan(basePackages = "com.studyspring")
public class BeanConfig { @Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
cacheManager.setCacheNames(getCacheNames());
return cacheManager;
} public List<String> getCacheNames() {
List<String> cacheNames = new ArrayList<String>();
cacheNames.add(CacheConstants.CACHE_RANDOM); return cacheNames;
} }

Stage类,顾名思义,作为main方法所在类作为测试等入口。

import com.studyspring.cache.CacheTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; /**
* Created by zhangmingbo on 2/23/17.
*/
public class Stage { public Stage() {
} public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class); CacheTest cacheTest = applicationContext.getBean(CacheTest.class); for (int i = 0; i < 5; i++) {
System.out.println(cacheTest.getRandomInt());
}
}
}

CacheTest业务类

package com.studyspring.cache;

import com.studyspring.constants.CacheConstants;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component; /**
* Created by zhangmingbo on 2/23/17.
*/ @Component
public class CacheTest { @Cacheable(cacheNames = CacheConstants.CACHE_RANDOM)
public Double getRandomInt() {
System.out.println("Call Random");
return Math.random() * 100;
} }

以上三个类是最主要的几个类,后面也许还会增加,根据需要来。

三、生成类图

  IntelliJ IDEA 提供了方便的类图生成工具。下面将介绍如何一步一步生成Cache源码需要的类图。

  第一步,关联到源码,展开Spring-context下面的cache节点。

  

  第二步,鼠标右键选择菜单中Show Diagram选项

  

  选中后将会出现下面这张萌萌哒的图,这个工具做得真心好看。

  

  第三步,熟悉常用功能

   展开Package:选中Package,点击键盘e

   折叠Package:选中Package,点击键盘c

   查看源码:Command + 向下箭头

   还有许多其它功能可以慢慢摸索。

四、一张完整的类图

  

Spring缓存源码剖析:(一)工具选择的更多相关文章

  1. Spring缓存源码剖析:(二)CacheManager

    一.CacheManager总览 如果需要Spring缓存可以正常工作,必须配置一个CacheManager. CacheManager实现类你可以配置Spring-context本身提供的Simpl ...

  2. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  3. spring jdbcTemplate源码剖析

    本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...

  4. Spring源码剖析9:Spring事务源码剖析

    转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提 ...

  5. 曹工说Spring Boot源码(19)-- Spring 带给我们的工具利器,创建代理不用愁(ProxyFactory)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  6. 曹工说Spring Boot源码(29)-- Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. Spring源码剖析依赖注入实现

    Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java   版权声明:本文为博主原 ...

  8. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  9. Spring AOP源码分析--代理方式的选择

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...

随机推荐

  1. spring3: Aspectj后置返回通知

    Aspectj后置返回通知 接口: package chapter1.server; public interface IHelloService2 { public int sayAfterRetu ...

  2. yii2:doajax(post)会报500错误

    yii2:doajax(post)会报500错误:这是因为yii2开启了防御csrf的攻击机制,可去先去掉,在控制器里去掉:public $enableCsrfValidation = false , ...

  3. Ajax的跨域问题(包括解决方案)?

    原因:js的同源策略限制,不同源会造成跨域 哪些情况会造成跨域? 子域名不同(WWW) 2.主域名不同(baidu.com) 3.端口号不同 4.IP地址和网址不同 解决方案: 使用jsonp技术,但 ...

  4. cvFindContours函数

    cvFindContours函数: int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, in ...

  5. cylance做的机器学习相关材料汇总

    https://www.cylance.com/en_us/products/our-products/protect----threatzero.html 产品介绍 关键!!!! https://w ...

  6. 使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)

    一.使用ZooKeeper实现Java跨JVM的分布式锁 二.使用ZooKeeper实现Java跨JVM的分布式锁(优化构思) 三.使用ZooKeeper实现Java跨JVM的分布式锁(读写锁) 读写 ...

  7. Myeclipse快捷键的设置以及默认的编码格式

    设置默认的编码格式

  8. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  9. jQuery的width()、innerWidth()、outerWidth()方法

    width(): 不包括元素的外边距(margin).内边距(padding).边框(border)等部分的宽度. innerWidth(): 包括元素的内边距(padding),但不包括外边距(ma ...

  10. 你不知道的sticky

    position:sticky,Chrome新版本已经做了支持.sticky的中文翻译是“粘性的”,position:sticky表现也符合这个粘性的表现.基本上,可以看出是position:rela ...