带着新人学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. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...
随机推荐
- net view ERROR 6118
如上图,使用net view命令出现错误6118(server2012),谷歌百度油管解决了. 尝试1: 把Computer Browser服务打开.https://blog.csdn.net/qq_ ...
- 使用spring中4.2.6版本使用@Value取值失败,结果为${xxx}的情况
环境:spring 4.2.6 使用全注解来获取值的时候发生@Value为写好的表达式 简单的代码: 实体类: public class RichMan { @Value(value=" ...
- ISP PIPLINE (九_1) Denoise 之 space domain denoise
1.空间域噪声类型 1.gauss+possion 2.椒盐噪声(dpc处理已经处理了) 去除空域噪声有哪些方法? 空域噪声一般的思想是对某pixel邻域的pixels进行加权平均. 比如 1.高斯降 ...
- mac os x 查看网络端口情况
查看端口是否打开 使用 netstat 命令 a. `netstat -nat | grep <端口号>` , 如命令 `netstat -nat | grep 3306` b. `net ...
- 吻逗死(windows)系统下自动部署脚本(for java spring*)及linux命令行工具
转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10051647.html (^^)(^^)自動部署腳本原本在上個公司就在使用,由於近期同事需要手動部署一個Spr ...
- 华为ssh远程登录,配置
- 动态规划-LIS
https://vjudge.net/contest/297216?tdsourcetag=s_pctim_aiomsg#problem/E #include<bits/stdc++.h> ...
- gym 101628
前几天感冒了三天没怎么写题...今天好很多了打个三星场找点手感. 不行啊我好菜啊.只会8个..补题的话,再说吧.G题感觉值得一补. 补了G,K不想写B不会. 说实话这个三星场还是很新人向的,知识点也蛮 ...
- Java使用BufferedImage修改图片内容
1.修改图片的架包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io& ...
- django 标签的使用
首先重建一个common的app 然后创建__init__使common成为一个包 注意templatetags 名字使固定的 并在下面创建一个名字为fitter的过滤器 注册过滤器app htm ...