带着新人学springboot的应用03(springboot+mybatis+缓存 下)
springboot+mybatis+缓存,基本的用法想必是会了,现在说一说内部大概的原理。
稍微提一下mybatis,只要导入了mybatis的依赖,那么有个自动配置类就会生效,你可以去mybatis的jar包里面的META-INF/spring.factories中看到这个xxxAutoConfiguration,就如下图所示,这个应该很熟悉了,所以我们要看看mybatis的配置,肯定要看这个类。

开这个类,看到这里

看了看,其他的没什么说的,要看看在yml给mybatis可以配置哪些参数,就去这个类MybatisProperties看看有哪些属性就ok了,用起来也是很容易。
接下来看看比较有趣的地方,看看缓存的原理。
缓存原理
肯定又是自动配置类,ctrl+N搜索一个CacheAutoConfiguration

我们要看看这个@Import导入了什么组件,点开这个类,打个断点调试一下

调试之后可以看到就是加载了一些xxxCacheConfiguration,有没有发现其中有一个是EnCacheCacheConfiguration,还有一个是RedisCacheConfiguration,不就是encache缓存,redis缓存嘛!即使没用过,名字应该听过吧,所以我们大概猜想一下,这是不是springboot提供的针对每个做缓存的公司做出来产品的配置类,只要我们导入相关的依赖,这些配置类就能够生效?

可以测试一下我们用的是哪一个,在yml文件中,加入一个配置debug:true,然后启动应用,可以看到所有配置类的打印日志
下图所示,说明默认的是用这个缓存配置类,当然你还可以看看其他的缓存配置类没有生效


说明springboot默认用的缓存配置类是SimpleCacheConfiguration,那我们来看看加载成功的这个缓存配置类,只要弄清楚这个,其他的肯定都差不多
打开SimpleCacheConfiguration这个类


我们看看缓存管理器里有什么;
回忆一下我上节说的,CacheManager负责哪个缓存公司做的产品,Cache表示这个缓存产品里面很多小空间并且我们要为它取个名字(从下图看,其实就是名字代表String,小空间就是Cache),而我们要存的键值对就是放在小空间里(Cache),由此可以大概推出Cache里面就是存放键值对的(潜台词就是Cache就是一个map)
ok,其实现在我们已经推断出来了所谓的缓存就是一个map,这个map里又嵌套了一个map,类似这样的Map<String,Map<key,value>>结构,接下来,我们继续看看源码(后面我所说的缓存其实对应这里就是Map<key,value>,这个东西等价于我前面提到的Cache,小空间)。




我们还可以看看是怎么根据key找到值,还有怎么将方法的返回值丢到缓存里去(咳,那个清空缓存的忘记了,其实就是从这个map里面删除数据,用remove方法,自己可以看看啊!)


看到这里,不知道大家是否大概对缓存有了一个本质的了解了,不要把缓存想得多么复杂,说破天了不就是一个map嘛!
其实那些缓存公司提供给我们用的就是一个Map<String,Map<key,value>>,其中通过很牛的算法,让我们用起来很流畅的这么一个东西。而且,我们用缓存的话,肯定要先指定那个String啊(可以指定多个哦,比如@Cacheable(cacheName={“name1”,“name2”}),不要不会用map了!!!),然后就是通过key(默认就是用方法里的参数作为key)去找到对应的value,这个value就是我们第二次以及之后查询需要从从缓存里拿到的数据。
我应该说的比较详细了,我大概总结一下:启动springboot-------->容器里没有缓存管理器,CacheAutoConfiguration才起作用---------->自动配置类有个注解@Import,导入了一个xxxSelector,这个xxxSelector向容器里导入很多的缓存配置类(其实默认起作用的就是SimpleCacheConfiguration)------------>SimpleCacheConfiguration配置类中向容器里丢进去一个缓存管理器-------------->这个缓存管理器内部其实就是一个Map<String,Cache>----------->第一次根据String去获取Cache,Cache为null,创建一个Cache,Cache是一个Map<key,value>----------------->执行service中的方法,返回值放进去这个Map<key,value>中,其中key是service内方法的形参(这里注意,后面我会说一说怎么将形参按照一定的规则包装成一个key的)-------------->第二次查询,首先根据String去找到对应的Cache,返回Cache,然后根据形参生成一个key,到上面的lookup方法去拿到数据,返回,结束。

小知识补充:
前面一直说按照一定的规则生成key,但是具体什么规则呢?我们就来看看。
第一种:我们自己指定的例如@Cacheable(key="#id"),就是指定形参id作为key,这里支持SpEL表达式,假如方法的返回值是对象student,可以写成@Cacheable(key="#result.id"),这是也是将返回结果的id作为key,具体的SpEL表达式可以自己查查资料学习。
第二种:springboot默认的,我们在哪里看呢?
使用断点调试





假如有兴趣自己去调试的小伙伴,可以参照一下我调试的位置,我把我调试的断点位置放出来:
断点位置




等到找到下图这个方法


ok,这断点位置就是这几个,调试启动springboot,在浏览器输入url,就会自己进入调试界面,你就慢慢点就ok了。
本来还要说点东西的,emmmm....篇幅太长了,估计还要往后拖了。。。。
带着新人学springboot的应用03(springboot+mybatis+缓存 下)的更多相关文章
- 带着新人学springboot的应用01(springboot+mybatis+缓存 上)
上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...
- 带着新人学springboot的应用04(springboot+mybatis+redis 完)
对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...
- 带着新人学springboot的应用07(springboot+RabbitMQ 下)
说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...
- 带着新人学springboot的应用13(springboot+热部署)
spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...
- 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)
这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...
- 带着新人学springboot的应用10(springboot+定时任务+发邮件)
接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...
- 带着新人学springboot的应用09(springboot+异步任务)
本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...
- 带着新人学springboot的应用08(springboot+jpa的整合)
这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...
- 带着新人学springboot的应用06(springboot+RabbitMQ 中)
上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...
随机推荐
- 【C语言编程练习】新娘与新郎
1. 题目要求 新郎A,B,C与新娘 X,Y,Z.有人不知道她们谁和谁结婚了,询问了6位新人中的三位,A说他将和X结婚,X说她的未婚夫是C,C说她会和Z结婚,一听就知道是全是假话,请编程找出谁和谁结婚 ...
- 【面试题】Java实现String的IndexOf方法
先说题后感:程序员这一行,很多时候,自驱学习能力是自我成长一个很重要的因素(当然技术最好的学习途径都是通过项目实践去学习.理解.掌握).而自学方法中,除了看官方文档.技术博客等途径之外,学习源码也是一 ...
- 对Jpa中Entity关系映射中mappedBy的理解
mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby ...
- go-设计思想
1, 围绕 简单 这一核心的设计 隐式接口,切片, 类的弱化,强制用组合 简洁高效的并发 弱化的指针 err 判定,先判错的习俗. 2, 有自己的坚持,不盲目攀比 比优点比不过很多语言,没C快,没ja ...
- vue 格式化银行卡(信用卡)每4位一个符号隔断
问题 在做银行卡输入框时有一个需求如题,这里举例用-隔断 调查 查看了很多大公司网站的银行卡输入,发现还有有很多缺陷的: 有的是在中间删除,光标会跳到最后: 有的是能删除掉中间隔断符的: 等等,逻辑感 ...
- 【类与对象】--------java基础学习第六天
类与对象 1. 对于面向对象的开发来讲也分为三个过程: OOA(面向对象分析) OOD(面向对象设计) OOP(面向对象编程) 2. 面向对象的基本特征 2.1. 封装:保护内部操作(属性,方法)不被 ...
- Java_集合
定义: 是一种工具,就像是容器,能存储任意数量的具有共同属性的对象. 与数组比较优点: (1)数组定义后长度不可变,集合长度可变: (2)数组只能通过下标访问,且下标类型只能是数字型,而有的集合(ma ...
- [LeetCode] Transpose Matrix 转置矩阵
Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...
- jstl使用中的错误----基于idea
第一:首先正确将jstl.jar和standard.jar导入项目的lib目录下,注意两者的版本信息 第二: <%@ taglib prefix="c" uri=" ...
- 关于实体类getset方法首字母小写问题
实体类:private Date cDateTime;private String cNickname; public Date getcDateTime() { return cDateTime;} ...