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

 更新时间:2023年10月02日 08:16:55   作者:StoneWu - 石头日记  
这篇文章主要介绍了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配置文件中的敏感信息

    详解如何保护SpringBoot配置文件中的敏感信息

    使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些,所以为了提高安全性,就需要对配置文件中的敏感信息进行保护,下面就为大家介绍一下实现方法吧
    2023-07-07
  • springboot整合企微webhook机器人发送消息提醒

    springboot整合企微webhook机器人发送消息提醒

    这篇文章主要为大家介绍了springboot整合企微webhook机器人发送消息提醒,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 下载远程maven仓库的jar 手动放到本地仓库详细操作

    下载远程maven仓库的jar 手动放到本地仓库详细操作

    这篇文章主要介绍了如何下载远程maven仓库的jar 手动放到本地仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • Java实现获取银行卡所属银行,验证银行卡号是否正确的方法详解

    Java实现获取银行卡所属银行,验证银行卡号是否正确的方法详解

    这篇文章主要介绍了Java实现获取银行卡所属银行,验证银行卡号是否正确的方法,结合实例形式详细分析了java判断银行卡归属地及有效性的原理与相关实现技巧,需要的朋友可以参考下
    2019-09-09
  • Java多线程死锁与资源限制操作

    Java多线程死锁与资源限制操作

    这篇文章主要介绍了Java多线程死锁与资源限制操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot整合mybatis实现简单的一对多级联查询功能

    springboot整合mybatis实现简单的一对多级联查询功能

    这篇文章主要介绍了springboot整合mybatis实现简单的一对多级联查询功能,分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • IDEA 单元测试覆盖技巧分享

    IDEA 单元测试覆盖技巧分享

    这篇文章主要介绍了IDEA 单元测试覆盖技巧分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • mybatis-plus查询方式,部分字段没有值

    mybatis-plus查询方式,部分字段没有值

    这篇文章主要介绍了mybatis-plus查询方式,部分字段没有值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java分布式学习之Kafka消息队列

    Java分布式学习之Kafka消息队列

    Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据
    2022-07-07
  • SpringBoot集成七牛云OSS的示例详解

    SpringBoot集成七牛云OSS的示例详解

    OSS的英文全称是Object Storage Service,翻译成中文就是对象存储服务,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具,本文给大家详细介绍了SpringBoot集成七牛云OSS的示例,需要的朋友可以参考下
    2023-11-11

最新评论