Spring Cache @Cacheable 缓存在部分Service中不生效的解决办法
1. 背景
最近开发的项目中,需要大量的使用到缓存以提升性能
其中,有个活动controller,需要查询所有的活动,代码如下:
@GetMapping("/list") public RestResult<List<ActivityInfoDTO>> list() { List<ActivityInfoDTO> list = activityService.getAllActivity(); return addRestResult(list); }
对应的ActivityService方法如下:
@Override @Cacheable(value = "ActivityInfoDTO", key = "'getAllActivity'") public List<ActivityInfoDTO> getAllActivity() { List<ActivityInfoDTO> allActivity = activityDefMapper.getAllActivity(); return allActivity; }
结构十分简单,但是奇怪的是,ActivityService里的方法完全不会走缓存
而另一个service,BannerInfoService则可以正常缓存
调试时可以看到,正常的BannerInfoService是有被cglib代理的
而ActivityService是没有被代理的
2. 解决方法
漫长的搜索过后,没能在网上找到解决方案
最终将目光瞄向了ActivityService的其他引用,于是猜测是否是循环引用导致ActivityService没有被代理
结果发现,在另一个OpusService中,有引用该ActivityService
同时OpusService也引用了MessagePushService,而这个MessagePushService又引用了OpusService
于是选择将OpusService中的ActivityService改为懒加载,加上@Lazy注解:
发现成功触发了缓存机制,调试信息也可以看到被cglib代理
3. 总结
之前遇到的缓存不生效大多都是因为在类内部通过this进行调用
这次遇到的情况确实不太常见,循环依赖会导致cglib无法成功代理被依赖的对象,导致缓存失效。
到此这篇关于Spring Cache @Cacheable 缓存在部分Service中不生效的解决办法的文章就介绍到这了,更多相关Spring Cache @Cacheable 缓存在部分Service中失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot整合企微webhook机器人发送消息提醒
这篇文章主要为大家介绍了springboot整合企微webhook机器人发送消息提醒,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12Java实现获取银行卡所属银行,验证银行卡号是否正确的方法详解
这篇文章主要介绍了Java实现获取银行卡所属银行,验证银行卡号是否正确的方法,结合实例形式详细分析了java判断银行卡归属地及有效性的原理与相关实现技巧,需要的朋友可以参考下2019-09-09springboot整合mybatis实现简单的一对多级联查询功能
这篇文章主要介绍了springboot整合mybatis实现简单的一对多级联查询功能,分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08
最新评论