带着新人学springboot的应用01(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嘛!

  其实那些缓存公司提供给我们用的就是一个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,这里支持sSpEL表达式,假如方法的返回值是对象student,可以写成@Cacheable(key="#result.id"),这是也是将返回结果的id作为key,具体的SpEL表达式可以自己查查资料学习。

  第二种:springboot默认的,我们在哪里看呢?

  使用断点调试

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

断点位置

  

  等到找到下图这个方法

  ok,这断点位置就是这几个,调试启动springboot,在浏览器输入url,就会自己进入调试界面,你就慢慢点就ok了。

  本来还要说点东西的,emmmm....篇幅太长了,估计还要往后拖了。。。。

原文地址:https://www.cnblogs.com/wyq1995/p/10022084.html

时间: 2024-11-05 18:42:30

带着新人学springboot的应用01(springboot+mybatis+缓存 下)的相关文章

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

继续接着上一节,大家应该知道驼峰命名法吧!就是我们javabean中属性一般命名是lastName,userName这种类型的,而数据库中列名一般都是last_name,user_name这种的,要让对应起来,在springboot中可以设置 另外大家可以看看我们用了mybatis依赖之后,导入了一些什么jar包,比较关键的是那个autoconfigure,其实内部就跟之前我们手写的那个starter原理差不多 我们也可以用xxxCustomizer来定制功能,以上面的驼峰命名为例,就可以使用这

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

说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发现很多你以为自己会的东西其实你并不会,然后你会经常在头脑中不断的搜索有关的片段,或者去别的大神博客里到处找有关的资料,最后领悟了属于自己的东西!然后再写出来和别人分享,别人也会给你点意见,你也会慢慢的改进.这不就是学习+复习+巩固+创新+分享+改进的这么的一个过程吗? 以前看过曹雪芹的红楼梦,让我印

带着新人学springboot的应用05(springboot+RabbitMQ 上)

这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queuing Protocol),专业名称叫做高级消息队列协议,就是只要你遵守这个协议,那么做出来的产品就能跨平台,跨语言,很牛的一个协议,具体多么牛可以自己百度一下. 而RabbitMQ就是基于这个协议的!很多语言都可以用RabbitMQ,例如python,C语言,PHP,Java等语言,而且windo

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

上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. 打开可视化页面,http://localhost:15672 顺便说一下RabbitMQ中的持持久化:这里持久化分为三种:消息持久化,交换器持久化,队列持久化... 举个例子,就简单说说交换器持久化,其实就是为了防止将消息发到交换器了,但是RabbitMQ服务器突然暴毙,没用了,那数据不就丧失了么?

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

本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的任务就是异步任务,定时任务,发邮件. 异步任务:其实就是一个很特别的方法,这个方法没有返回值(也可以有返回值,后面会说的),但是方法内部的逻辑会耗费很多时间!例如,用户请求每次到controller,要执行到这个异步方法的时候,我们只需要命令一个空闲状态的线程去执行它即可,由于没有返回值不影响后续代

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

spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫做热部署,看到这名字就吓退了我继续学习的欲望!),但是实际上可以把这个看成是一个小技巧. 就是导入一个依赖,要用的时候,就是快捷键操作:Ctrl+F9 有什么用呢?就是避免你每次对springboot修改一点东西,就要重新启动springboot应用,贼麻烦!而且对于电脑性能不怎么样的小伙伴来说(咳

带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)

上半节已经下载好了Zookeeper,以及新建了两个应用provider和consumer,这一节我们就结合dubbo来测试一下分布式可不可以用. 现在就来简单用一下,注意:这里只是涉及最简单的部分,新手入门用的,详细的内容要学习的可以自己查一查资料;然后再说说用Zookeeper当作注册中心的一个特点. 话说注册中心是一个类似第三方软件的东西,那么我们能不能用Dubbo+其他注册中心呢?其实也是可以的,比如redis,有兴趣的可以查查资料自己试试,原理都差不多. 1.导入依赖       两个

重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他

[源码下载] 作者:webabcd 介绍重新想象 Windows 8.1 Store Apps 之通信的新特性 通过 HttpBaseProtocolFilter 控制缓存逻辑,以及如何通过 HttpBaseProtocolFilter 管理 cookie 自定义 HttpFilter 其他 示例HTTP 服务端WebServer/HttpDemo.aspx.cs /* * 用于响应 http 请求 */ using System; using System.IO; using System.T

【spring-boot】快速构建spring-boot微框架

spring-boot是一个快速构建环境的一套框架,其设计理念是尽可能的减少xml的配置,用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 废话不多说,关于spring-boot是什么具体请百度. 官网:http://projects.spring.io/spring-boot 1. spring-boot是一个mavan项目,所以其使用的jar包全部是通过maven管理,当然,使用maven也是非常方便的. 首先上我的