@Cacheable等註解在類內調用失效原因分析及解決方案

首發地址:keysking瞎寫東西的地方

起因

最近使用@Cacheable來進行接口緩存,但是出現了一個奇怪的現象,緩存註解寫在Service的函數上,用Controller調就能正常緩存進redis,但是在Service類裏調用卻不能正常緩衝,想當玄幻.

破案

百思不解的我最後只得求助某大佬學妹,得到了一個答案:

在同一個類裏調用使用@Cacheable的接口不會生效!!!

分析

查過一些資料後算是搞明白了爲啥本類不能調用.

因爲@Cacheable等註解實現的功能是通過AOP完成的,所以其他類調用使用這些註解的函數時,使用的是這些函數所在類的代理類,即已經將註解翻譯爲實際功能的替身類.

但是在本類裏調用卻是直接調用的本類原類裏面的函數,未經代理,所以也就完不成這些註解所提供的功能.

解決方法

方法一. 將此方法挪到其他類裏

點評: 確實能解決…但是卻影響代碼結構,很讓人難受,簡直就是胡鬧

評分: ★☆☆☆☆

方法二.使用(你的Service類)AopContext.currentProxy()獲取當前類的代理類

點評: 可以,比較方便地解決了問題,但是注意使用時要在主類上加上一句@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true) 以允許AOP暴露代理

評分:★★★☆☆

方法三: 我注我自己
通過@Autowired,把自己的代理類注入到類內部,使用同類函數的時候,直接掉管理類的函數

點評:emmm,自己想試試這樣行不行,沒想到沒啥毛病,使用起來更舒服了,只要不是在構造器裏用,應該沒什麼問題

評分:★★★★☆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章