@Cacheable 接口缓存 注解在类内调用失效原因分析及解决方案

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

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

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

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

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

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

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

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

评分: ★☆☆☆☆

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

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

评分:★★★☆☆

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

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

评分:★★★★☆
———————————————

原文链接:https://blog.csdn.net/keysking/article/details/104187789

posted on   天军  阅读(309)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-07-26 Delphi7如何实现让Tedit显示文字垂直居中(上下居中)
2017-07-26 delphi 在代码中 添加 TO-DO 并且 管理

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示