Spring缓存源码剖析:(一)工具选择
从本篇开始对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缓存源码剖析:(一)工具选择的更多相关文章
- Spring缓存源码剖析:(二)CacheManager
一.CacheManager总览 如果需要Spring缓存可以正常工作,必须配置一个CacheManager. CacheManager实现类你可以配置Spring-context本身提供的Simpl ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- spring jdbcTemplate源码剖析
本文浅析 spring jdbcTemplate 源码,主要是学习其设计精髓.模板模式.巧妙的回调 一.jdbcTemplate 类结构 ①.JdbcOperations : 接口定义了方法,如 &l ...
- Spring源码剖析9:Spring事务源码剖析
转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提 ...
- 曹工说Spring Boot源码(19)-- Spring 带给我们的工具利器,创建代理不用愁(ProxyFactory)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 曹工说Spring Boot源码(29)-- Spring 解决循环依赖为什么使用三级缓存,而不是二级缓存
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- Spring源码剖析依赖注入实现
Spring源码剖析——依赖注入实现原理 2016年08月06日 09:35:00 阅读数:31760 标签: spring源码bean依赖注入 更多 个人分类: Java 版权声明:本文为博主原 ...
- 转 Spring源码剖析——核心IOC容器原理
Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...
- Spring AOP源码分析--代理方式的选择
能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 年前写了一个面试突击系列的文章,目前只有redis相关的.在这个系列里,我整理了一些面试题与大家 ...
随机推荐
- spring3: Aspectj后置返回通知
Aspectj后置返回通知 接口: package chapter1.server; public interface IHelloService2 { public int sayAfterRetu ...
- yii2:doajax(post)会报500错误
yii2:doajax(post)会报500错误:这是因为yii2开启了防御csrf的攻击机制,可去先去掉,在控制器里去掉:public $enableCsrfValidation = false , ...
- Ajax的跨域问题(包括解决方案)?
原因:js的同源策略限制,不同源会造成跨域 哪些情况会造成跨域? 子域名不同(WWW) 2.主域名不同(baidu.com) 3.端口号不同 4.IP地址和网址不同 解决方案: 使用jsonp技术,但 ...
- cvFindContours函数
cvFindContours函数: int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour, in ...
- cylance做的机器学习相关材料汇总
https://www.cylance.com/en_us/products/our-products/protect----threatzero.html 产品介绍 关键!!!! https://w ...
- 使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)
一.使用ZooKeeper实现Java跨JVM的分布式锁 二.使用ZooKeeper实现Java跨JVM的分布式锁(优化构思) 三.使用ZooKeeper实现Java跨JVM的分布式锁(读写锁) 读写 ...
- Myeclipse快捷键的设置以及默认的编码格式
设置默认的编码格式
- 剑指offer--30.二叉搜索树的后序遍历序列
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...
- jQuery的width()、innerWidth()、outerWidth()方法
width(): 不包括元素的外边距(margin).内边距(padding).边框(border)等部分的宽度. innerWidth(): 包括元素的内边距(padding),但不包括外边距(ma ...
- 你不知道的sticky
position:sticky,Chrome新版本已经做了支持.sticky的中文翻译是“粘性的”,position:sticky表现也符合这个粘性的表现.基本上,可以看出是position:rela ...