由於項目需要使用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
解決此問題的提交記錄: