Spring Cache @Cacheable 緩存在部分Service中不生效的解決辦法
1. 背景
最近開發(fā)的項(xiàng)目中,需要大量的使用到緩存以提升性能
其中,有個(gè)活動(dòng)controller,需要查詢所有的活動(dòng),代碼如下:
@GetMapping("/list") public RestResult<List<ActivityInfoDTO>> list() { List<ActivityInfoDTO> list = activityService.getAllActivity(); return addRestResult(list); }
對(duì)應(yīng)的ActivityService方法如下:
@Override @Cacheable(value = "ActivityInfoDTO", key = "'getAllActivity'") public List<ActivityInfoDTO> getAllActivity() { List<ActivityInfoDTO> allActivity = activityDefMapper.getAllActivity(); return allActivity; }
結(jié)構(gòu)十分簡(jiǎn)單,但是奇怪的是,ActivityService里的方法完全不會(huì)走緩存
而另一個(gè)service,BannerInfoService則可以正常緩存
調(diào)試時(shí)可以看到,正常的BannerInfoService是有被cglib代理的
而ActivityService是沒有被代理的
2. 解決方法
漫長(zhǎng)的搜索過后,沒能在網(wǎng)上找到解決方案
最終將目光瞄向了ActivityService的其他引用,于是猜測(cè)是否是循環(huán)引用導(dǎo)致ActivityService沒有被代理
結(jié)果發(fā)現(xiàn),在另一個(gè)OpusService中,有引用該ActivityService
同時(shí)OpusService也引用了MessagePushService,而這個(gè)MessagePushService又引用了OpusService
于是選擇將OpusService中的ActivityService改為懶加載,加上@Lazy注解:
發(fā)現(xiàn)成功觸發(fā)了緩存機(jī)制,調(diào)試信息也可以看到被cglib代理
3. 總結(jié)
之前遇到的緩存不生效大多都是因?yàn)樵陬悆?nèi)部通過this進(jìn)行調(diào)用
這次遇到的情況確實(shí)不太常見,循環(huán)依賴會(huì)導(dǎo)致cglib無法成功代理被依賴的對(duì)象,導(dǎo)致緩存失效。
到此這篇關(guān)于Spring Cache @Cacheable 緩存在部分Service中不生效的解決辦法的文章就介紹到這了,更多相關(guān)Spring Cache @Cacheable 緩存在部分Service中失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合單機(jī)緩存ehcache的實(shí)現(xiàn)
- SpringBoot中整合Ehcache實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的詳細(xì)過程
- Spring中的@Cacheable緩存注解詳解
- SpringBoot?Cache?二級(jí)緩存的使用
- 詳解如何使用SpringBoot的緩存@Cacheable
- Spring中緩存注解@Cache的使用詳解
- SpringCache緩存處理詳解
- 詳解Springboot @Cacheable 注解(指定緩存位置)
- Springboot使用@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存
- SpringBoot使用Spring?Cache高效處理緩存數(shù)據(jù)
相關(guān)文章
SpringBoot初始化接口CommandLineRunner示例詳解
這篇文章主要介紹了SpringBoot初始化接口CommandLineRunner,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07SpringBoot中使用SpringSecurity進(jìn)行權(quán)限控制的示例代碼
本文將詳細(xì)介紹如何在Spring Boot應(yīng)用程序中使用Spring Security進(jìn)行權(quán)限控制,我們將探討Spring Security的基本概念,以及如何使用Spring Security實(shí)現(xiàn)認(rèn)證和授權(quán),需要的朋友可以參考下2024-02-02詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法
這篇文章主要介紹了詳解Java的內(nèi)置異常以及創(chuàng)建自定義異常子類的方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09Knife4j?3.0.3?整合SpringBoot?2.6.4的詳細(xì)過程
本文要講的是?Knife4j?3.0.3?整合SpringBoot?2.6.4,在SpringBoot?2.4以上的版本和之前的版本還是不一樣的,這個(gè)也容易導(dǎo)致一些問題,本文就這兩個(gè)版本的整合做一個(gè)實(shí)戰(zhàn)介紹2022-09-09