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

本文深入探讨了在Spring框架中使用@Cacheable注解进行缓存时遇到的一个诡异现象:当从同一Service类内调用带有该注解的方法时,缓存功能无法生效。文章分析了这一问题的原因在于AOP代理机制,并提供了三种解决方案,包括挪动方法、使用AopContext.currentProxy()及自我注入代理类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

起因

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

破案

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

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

分析

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

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

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

解决方法

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

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

评分: ★☆☆☆☆

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

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

评分:★★★☆☆

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

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

评分:★★★★☆

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值