帶着新人學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....篇幅太長了,估計還要往后拖了。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM