起因
最近使用@Cacheable来进行接口缓存,但是出现了一个奇怪的现象,缓存注解写在Service的函数上,用Controller调就能正常缓存进redis,但是在Service类里调用却不能正常缓冲,想当玄幻.
破案
百思不解的我最后只得求助某大佬学妹,得到了一个答案:
在同一个类里调用使用@Cacheable的接口不会生效!!!
分析
查过一些资料后算是搞明白了为啥本类不能调用.
因为@Cacheable等注解实现的功能是通过AOP完成的,所以其他类调用使用这些注解的函数时,使用的是这些函数所在类的代理类,即已经将注解翻译为实际功能的替身类.
但是在本类里调用却是直接调用的本类原类里面的函数,未经代理,所以也就完不成这些注解所提供的功能.
解决方法
方法一. 将此方法挪到其他类里
点评: 确实能解决…但是却影响代码结构,很让人难受,简直就是胡闹
评分: ★☆☆☆☆
方法二.使用(你的Service类)AopContext.currentProxy()
获取当前类的代理类
点评: 可以,比较方便地解决了问题,但是注意使用时要在主类上加上一句@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
以允许AOP暴露代理
评分:★★★☆☆
方法三: 我注我自己,通过@Autowired
,把自己的代理类注入到类内部,使用同类函数的时候,直接掉管理类的函数
点评:emmm,自己想试试这样行不行,没想到没啥毛病,使用起来更舒服了,只要不是在构造器里用,应该没什么问题
评分:★★★★☆
想想你的文章写的特别好https://www.ea55.com/
看的我热血沸腾啊https://www.237fa.com/