SpringCache @Cacheable 在同一個類中調用方法,致使緩存不生效的問題及解決辦法

因爲項目須要使用SpringCache來作一點緩存,但本身以前沒有使用過(實際上是沒有聽過)SpringCache,因而,必須先學習之。git

在網上找到一篇文章,比較好,就先學習了,地址是:github

https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/spring

在此感謝原博主的無私奉獻~~謝謝~~緩存

 

一口氣看下來,其實也容易理解、不算難。同時,本身的我的習慣是把其中的代碼Copy出來,Paste到Idea中調試並運行,同時,也把代碼提交到Github。因而,對於SpringCache,又在Github上建立了一個Repository,地址是:學習

https://github.com/cyhbyw/springCache測試

 

Demo很快學習完成。幾天後,項目中也使用上了相應代碼。一切看起來都那麼順利,直到……spa

直到有一天,本身測試的時候,發現緩存的方法並無生效,方法仍是照樣被調用了、照樣去DB中取數據而不是從緩存中取。插件

因而,尋找RootCause。翻譯

再回頭去看那篇文章,裏面寫得很清楚,以下圖:3d

顯然,就是在同一個類中,MethodA 調用了 MethodB,那麼 MethodB 上面的 @Cacheable 註釋就會失效!

而解決辦法,人家也說了,以下圖:

就是:SpringAOP 沒法解決,須要使用 AspectJ 來解決!

 

那麼,接下來的問題就是:如何從 SpringAOP 切換到 AspectJ 呢?

網上搜索了一大堆(至於當時本身究竟是如何一步一步搜索到結果的,已經記不得了),最後找到的解決辦法以下:

第一步:

SpringCache默認的 mode = proxy,須要將其設置爲mode = aspectj,以下2圖所示

之前的:

修改後:

那這個 mode 究竟是個什麼意思呢?查看 XSD 文件,說明以下:

簡單翻譯以下:被註解的Bean究竟是使用SpringAOP仍是AspectJ來代理?AspectJ代理須要在ClassPath中添加 spring-aspects.jar,同時啓用加載期織入(load-time weaving)或者編譯期織入 (compile-time weaving)。同時,註解只能做用於類上。接口上將不生效。

因此,將 mode = proxy 改成 mode = aspectj 就是天然的了。

第二步:

完成上面翻譯內容所須要的動做。

2.1步:在 POM 中加入 spring-aspects.jar 的依賴

2.2步:在 POM 中添加插件以開啓 編譯期織入 功能,此插件內容截圖以下

 

再次測試,MethodB 中的 @Cacheable 已經生效!

 

最後,再次奉獻本身的 Github 地址:

https://github.com/cyhbyw/springCache

工程名:ibmSpringCache

解決此問題的提交記錄:

相關文章
相關標籤/搜索