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+缓存 下)的更多相关文章

  1. 带着新人学springboot的应用01(springboot+mybatis+缓存 上)

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  2. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

  3. 带着新人学springboot的应用07(springboot+RabbitMQ 下)

    说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...

  4. 带着新人学springboot的应用13(springboot+热部署)

    spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...

  5. 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

    这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...

  6. 带着新人学springboot的应用10(springboot+定时任务+发邮件)

    接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...

  7. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  8. 带着新人学springboot的应用08(springboot+jpa的整合)

    这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,所以本质就是springboot和hibernate的整合. 说实话,听别人都说spring data ...

  9. 带着新人学springboot的应用06(springboot+RabbitMQ 中)

    上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...

随机推荐

  1. yum安装k8s集群(kubernetes)

    此案例是以一个主,三个node来部署的,当然node可以根据自己情况部署 192.168.1.130 master 192.168.1.131 node1 192.168.1.132 node2 19 ...

  2. PBRT笔记(7)——反射模型

    基础术语 表面反射可以分为4大类: diffuse 漫反射 glossy specular 镜面反射高光 perfect specular 完美反射高光 retro-reflective distri ...

  3. tensorflow 使用 5 mnist 数据集, softmax 函数

    用于分类  softmax 函数 手写数据识别:

  4. 【安全性测试】利用反编译查看对应activity的方法采用hook技术绑定劫持_入门

    本次主要为了研究手机端的安全性而写的一篇文章,在基于自己对手机安全性的研究下,想到了这些工具之间的结合,当然这也算是第一次对手机安全研究勇敢地踏出一步,也不知道是否成功,还是准备撞南墙撞到底吧! 使用 ...

  5. react-router路由地址变了页面却没有跳转的解决办法

    最近,自己在摸索react的时候,遇到一个很奇葩的问题,大概是这样的: 我从列表页使用Link跳转到详情页面,列表页面的路由是'/list',详情页面的路由是'/list/detail',由于详情页面 ...

  6. numpy地址

    pip安装  http://zhidao.baidu.com/link?url=nkRwDOZ1ALMjRsWHGMR1nLSIyuVycoD4j-mhGDsYptPwDRGYcE8u4_B9VvYk ...

  7. C++ STL编程轻松入门【转载】

    1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL "什么是STL?",假如你对STL还知之甚少,那么我想,你一定很想知道这个问题的答案,坦率地讲,要指望用短短数 ...

  8. vue 验证电话

    <el-form :model="orderaddForm" :rules="rulesPhone" ref="orderaddForm&quo ...

  9. 自己封装element-ui树组件的过滤

    前言:vue开发项目时用到了element-ui的树组件,但是发现一执行过滤事件,树就全部都展开了,为了解决这个问题,只能自己先过滤数剧,再赋值给树组件的data,就避免了一上来全部展开的尴尬. 一. ...

  10. postgrel执行VACUUM报VACUUM cannot run inside a transaction block

    在python脚本里执行: sql_gp1 = "VACUUM dwd_access_record_inout_temp" sql_gp2 = "delete from ...