起因

最近使用@Cacheable来进行接口缓存,但是出现了一个奇怪的现象,缓存注解写在Service的函数上,用Controller调就能正常缓存进redis,但是在Service类里调用却不能正常缓冲,想当玄幻.

破案

百思不解的我最后只得求助某大佬学妹,得到了一个答案:

在同一个类里调用使用@Cacheable的接口不会生效!!!

分析

查过一些资料后算是搞明白了为啥本类不能调用.

因为@Cacheable等注解实现的功能是通过AOP完成的,所以其他类调用使用这些注解的函数时,使用的是这些函数所在类的代理类,即已经将注解翻译为实际功能的替身类.

但是在本类里调用却是直接调用的本类原类里面的函数,未经代理,所以也就完不成这些注解所提供的功能.

解决方法

方法一. 将此方法挪到其他类里

点评: 确实能解决…但是却影响代码结构,很让人难受,简直就是胡闹

评分: ★☆☆☆☆

方法二.使用(你的Service类)AopContext.currentProxy()获取当前类的代理类

点评: 可以,比较方便地解决了问题,但是注意使用时要在主类上加上一句@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true) 以允许AOP暴露代理

评分:★★★☆☆

方法三: 我注我自己,通过@Autowired,把自己的代理类注入到类内部,使用同类函数的时候,直接掉管理类的函数

点评:emmm,自己想试试这样行不行,没想到没啥毛病,使用起来更舒服了,只要不是在构造器里用,应该没什么问题

评分:★★★★☆

Last modification:February 15th, 2020 at 09:12 pm
如果觉得我的文章对你有用,请随意赞赏