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


由於項目需要使用SpringCache來做一點緩存,但自己之前沒有使用過(其實是沒有聽過)SpringCache,於是,必須先學習之。

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

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

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

 

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

https://github.com/cyhbyw/springCache

 

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

直到有一天,自己測試的時候,發現緩存的方法並沒有生效,方法還是照樣被調用了、照樣去DB中取數據而不是從緩存中取。

於是,尋找RootCause。

再回頭去看那篇文章,里面寫得很清楚,如下圖:

顯然,就是在同一個類中,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

解決此問題的提交記錄:

 


免責聲明!

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



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