带着新人学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....篇幅太长了,估计还要往后拖了。。。。
上一篇: iOS证书配置与管理
推荐阅读
-
带着新人学springboot的应用01(springboot+mybatis+缓存 上)
-
带着新人学springboot的应用07(springboot+RabbitMQ 下)
-
带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)
-
带着新人学springboot的应用01(springboot+mybatis+缓存 下)
-
带着新人学springboot的应用07(springboot+RabbitMQ 下)
-
带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)
-
带着新人学springboot的应用01(springboot+mybatis+缓存 下)