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