@Cacheable未生效的原因

@Cacehable

当第一次查询数据库后,将数据添加到缓存中,第二次查询数据库时可以直接走缓存,不必再走数据库

注意!!!如果在本类中调用此注解标记的方法,并不会走缓存!!!

不调用的原因

为什么缓存没有被正常创建?? 因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法(JDK动态代理、CGLib代理),这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库。

@Cacheable 的一些注意点 1、因为@Cacheable 由AOP 实现,所以,如果该方法被其它注解切入,当缓存命中的时候,则其它注解不能正常切入并执行,@Before 也不行,当缓存没有命中的时候,其它注解可以正常工作

2、@Cacheable 方法不能进行内部调用,否则缓存无法创建

@Cacheable标注的方法,如果其所在的类实现了某一个接口,那么该方法也必须出现在接口里面,否则cache无效。

具体的原因是, Spring把实现类装载成为Bean的时候,会用代理包装一下,所以从Spring Bean的角度看,只有接口里面的方法是可见的,其它的都隐藏了,自然课看不到实现类里面的非接口方法,@Cacheable不起作用。

解决办法:把待cache的方法移到接口里面。

另外衍生两个小问题:

  1. @Cacheable放接口里面可以吗?答案是:不行。

  2. 如果某一个Bean并没有实现任何接口,@Cacheable标注的方法有什么要求? 答案是public即可。这种Bean也被Spring产生代理,是CGlib代理,通过动态生成子类继承并重写其方法,所以 看得到的只有public方法。

本质是Spring代理的问题,很多的基础设施可能都会遇到类似的问题。比如安全,事务,日志等等。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
@Cacheable注解在Spring中用于实现缓存功能。在使用@Cacheable注解时,有几个原因可能导致注解不生效。 首先,static关键字可能导致@Cacheable注解动态代理失败,从而注解不生效。这是因为静态方法无法被动态代理拦截和处理。所以,如果你在静态方法上使用了@Cacheable注解,那么注解就不会起作用。 其次,如果在同一个类中的一个方法内调用了另一个方法,而被调用的方法使用了@Cacheable注解,那么调用者方法内部对被调用方法的调用将不会经过代理,因此注解也不会生效。 此外,@Cacheable注解是通过AOP代理实现的,它会创建一个内部类来代理缓存方法。这样一来,类内部的方法调用类内部的缓存方法将不会经过代理。因此,如果在同一个类内部的方法之间相互调用,并且被调用的方法使用了@Cacheable注解,那么注解也会失效。 总结起来,@Cacheable注解不生效原因可能包括:使用了static关键字、同一个类内部方法之间的相互调用、以及类内部方法调用类内部的缓存方法。在使用@Cacheable注解时,需要注意避免以上情况,确保注解能够正确地生效。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [@Cacheable注解不生效原因](https://blog.csdn.net/ss_synchronized/article/details/119183109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用](https://download.csdn.net/download/weixin_38611877/12781025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [@Cacheable注解不生效](https://blog.csdn.net/Little___Turtle/article/details/123837068)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值