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. 使用SQL-Front启动MySQL8.0报错

    这学期学习数据库,电脑上分别装有phpStudy(自带的MySQL版本为5.5)和MySQL8.0.11,于是想用phpStudy中的SQL Front连接到8.0的数据库.手动开启8.0的MySQL ...

  2. jquery ajax中success与complete的执行顺序

    jquery ajax中success与complete的执行顺序 jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) ...

  3. Hashlib加密,内置函数,安装操作数据库

    hashlib模块的md5加密: md5同样的内容加密后是一样的 md5加密后是不可逆的.即能加密,没办法解密. 撞库: 只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了. 登录密码:注册 ...

  4. 新建一个express项目的流程

    1.先创建一个文件夹,然后创建一个项目,默认有一个:package.json 文件 #初始化项目 npm init 2.初始化项目会出现一个默认的提醒 #这个实用程序将指导您创建一个包,json文件. ...

  5. DAO模式

    什么是DAO模式: DAO(Data Access Object Pattern)用于将低层的数据操作API与上层的业务逻辑层分离,其主要涉及以下几个部分: 1.Data Access Object ...

  6. System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止

    System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止. 错误原因:输入的字符串长度超过数据库设置的长度

  7. window上杀死node进程

    1.查询端口占用的进程ID点击"开始"-->"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:netst ...

  8. 对于Python turtle的学习笔记

    进一步地,我尝试学习了Python 的其中一个非常重要的函数库——turtle库 这是一个用于python绘图的函数库,方便又好用! 对于它的安装,现在我们所用的python 3的系统运用到的指令是: ...

  9. Spring中Model、ModelMap及ModelAndView之间的区别

    Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

  10. Servlet 监听器Listner

    定义:      专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动. Servlet 规范为每种事件监听器都定义了相应的接口,它用于监听 ...