@Cacheable等注解在类内调用失效原因分析及解决方案

首发地址:keysking瞎写东西的地方

起因

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

破案

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

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

分析

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

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

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

解决方法

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

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

评分: ★☆☆☆☆

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

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

评分:★★★☆☆

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

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

评分:★★★★☆

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值