Spring Cache @Cacheable 缓存在部分Service中不生效的解决办法

作者: StoneWu  |  时间: 2021-01-22 18:24:27  |  
分类: JAVA开发  |  1 条评论  |  2329 次浏览

一、背景

最近开发的项目中,需要大量的使用到缓存以提升性能

其中,有个活动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是没有被代理的

二、解决方法

漫长的搜索过后,没能在网上找到解决方案

最终将目光瞄向了ActivityService的其他引用,于是猜测是否是循环引用导致ActivityService没有被代理

结果发现,在另一个OpusService中,有引用该ActivityService

同时OpusService也引用了MessagePushService,而这个MessagePushService又引用了OpusService:

OpusService

 

MessagePushService

 

于是选择将OpusService中的ActivityService改为懒加载,加上@Lazy注解:

修改后的OpusService

 

发现成功触发了缓存机制,调试信息也可以看到被cglib代理:

service已经被代理

三、总结

之前遇到的缓存不生效大多都是因为在类内部通过this进行调用

这次遇到的情况确实不太常见,循环依赖会导致cglib无法成功代理被依赖的对象,导致缓存失效。

回复列表
加载中~
暂时木有内容~
回复于 审核中
开始你的表演ಠᴗಠ
邮件通知