首發地址:keysking瞎寫東西的地方
起因
最近使用@Cacheable來進行接口緩存,但是出現了一個奇怪的現象,緩存註解寫在Service的函數上,用Controller調就能正常緩存進redis,但是在Service類裏調用卻不能正常緩衝,想當玄幻.
破案
百思不解的我最後只得求助某大佬學妹,得到了一個答案:
在同一個類裏調用使用@Cacheable的接口不會生效!!!
分析
查過一些資料後算是搞明白了爲啥本類不能調用.
因爲@Cacheable等註解實現的功能是通過AOP完成的,所以其他類調用使用這些註解的函數時,使用的是這些函數所在類的代理類,即已經將註解翻譯爲實際功能的替身類.
但是在本類裏調用卻是直接調用的本類原類裏面的函數,未經代理,所以也就完不成這些註解所提供的功能.
解決方法
方法一. 將此方法挪到其他類裏
點評: 確實能解決…但是卻影響代碼結構,很讓人難受,簡直就是胡鬧
評分: ★☆☆☆☆
方法二.使用(你的Service類)AopContext.currentProxy()
獲取當前類的代理類
點評: 可以,比較方便地解決了問題,但是注意使用時要在主類上加上一句@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
以允許AOP暴露代理
評分:★★★☆☆
方法三: 我注我自己
通過@Autowired
,把自己的代理類注入到類內部,使用同類函數的時候,直接掉管理類的函數
點評:emmm,自己想試試這樣行不行,沒想到沒啥毛病,使用起來更舒服了,只要不是在構造器裏用,應該沒什麼問題
評分:★★★★☆