Spring全家桶中@CacheEvict無效情況的問題解決
一、背景介紹
SpringBoot中使用@Cacheable注解緩存數(shù)據(jù),使用@CacheEvict注解刪除緩存。但是在項(xiàng)目使用過程中,發(fā)現(xiàn)使用@CacheEvict注解刪除緩存無效。
拓展:@CacheEvict 就是一個(gè)觸發(fā)器,在每次調(diào)用被它注解的方法時(shí),就會(huì)觸發(fā)刪除它指定的緩存的動(dòng)作。跟 @Cacheable 和 @CachePut 一樣,@CacheEvict 也要求指定一個(gè)或多個(gè)緩存,也指定自定義的緩存解析器和 key 生成器,也支持指定條件(condition 參數(shù))。
@CacheEvict 是用來清除緩存的,有以下屬性:
value:緩存位置名稱,不能為空。
key:緩存的key,默認(rèn)為空。
condition:觸發(fā)條件,只有滿足條件的情況才會(huì)清除緩存,默認(rèn)為空,支持SpEL。
allEntries:true表示清除value中的全部緩存,默認(rèn)為false。
二、原因分析
經(jīng)過網(wǎng)絡(luò)搜索與總結(jié),Spring全家桶中@CacheEvict無效的原因有以下幾種情況:
- 1、使用@CacheEvict注解的方法必須是Controller層直接調(diào)用,Service里間接調(diào)用不生效。(我本次出現(xiàn)無效的原因)
- 2、key值跟你查詢方法的key值不統(tǒng)一,所以導(dǎo)致緩存并沒有清除。
- 3、把@CacheEvict的方法和@Cacheable的方法放到一個(gè)java文件中寫,如果這兩個(gè)注解在兩個(gè)java文件的話,會(huì)導(dǎo)致@CacheEvict失效。
- 4、返回值必須設(shè)置為void才會(huì)生效。網(wǎng)絡(luò)上有很多同學(xué)有返回值的使用@CacheEvict這個(gè)注解也是無效的。
@CacheEvict annotation
It is important to note that void methods can be used with @CacheEvict
- 5、@CacheEvict必須作用在走代理的方法上。同原因1。
在使用Spring @CacheEvict注解的時(shí)候,要注意,如果類A的方法function1()被標(biāo)注了 @CacheEvict注解,那么當(dāng)類A的其他方法,例如:function2(),去直接調(diào)用function1()的時(shí)候, @CacheEvict是不起作用的,原因是 @CacheEvict是基于Spring AOP代理類,function2()屬于內(nèi)部方法,直接調(diào)用function1()時(shí),是不走代理的。
@CacheEvict不生效的代碼示例如下:

三、解決方案
知道原因之后,就知道怎么解決了,由于以上有幾種原因,針對(duì)每種原因的解決方案不同,各自對(duì)應(yīng)解決即可。
以下為本文中出現(xiàn)問題的解決方案

到此這篇關(guān)于Spring全家桶中@CacheEvict無效情況的問題解決的文章就介紹到這了,更多相關(guān)Spring @CacheEvict無效情況內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 緩存注解@Cacheable、@CachePut、@CacheEvict超詳細(xì)實(shí)戰(zhàn)
- SpringBoot中的@CacheEvict 注解的實(shí)現(xiàn)
- 詳解Spring數(shù)據(jù)緩存注解@Cacheable、@CachePut、@CacheEvict
- Springboot Cache @CacheEvict 無法模糊刪除的解決方案
- 詳解Spring緩存注解@Cacheable,@CachePut , @CacheEvict使用
- spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
相關(guān)文章
idea項(xiàng)目打開后出現(xiàn)橙色的時(shí)鐘圖標(biāo)的解決
本文主要介紹了idea項(xiàng)目打開后出現(xiàn)橙色的時(shí)鐘圖標(biāo)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringBoot整合rabbitMq自定義消息轉(zhuǎn)換方式
這篇文章主要介紹了SpringBoot整合rabbitMq自定義消息轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Mybatis如何自動(dòng)生成數(shù)據(jù)庫表的實(shí)體類
這篇文章主要介紹了Mybatis自動(dòng)生成數(shù)據(jù)庫表的實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
mybatis 映射文件中if標(biāo)簽判斷字符串相等的兩種方式
這篇文章主要介紹了mybatis 映射文件中if標(biāo)簽判斷字符串相等的方式,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題
這篇文章主要介紹了SpringBoot內(nèi)嵌tomcat處理有特殊字符轉(zhuǎn)義的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
SpringBoot實(shí)現(xiàn)插件化架構(gòu)的4種方案詳解
在復(fù)雜業(yè)務(wù)場(chǎng)景下,傳統(tǒng)的單體應(yīng)用架構(gòu)往往面臨著功能擴(kuò)展困難等困難,插件化架構(gòu)作為一種模塊化設(shè)計(jì)思想的延伸,能夠使系統(tǒng)具備更好的擴(kuò)展性和靈活性,下面我們來看看SpringBoot環(huán)境下實(shí)現(xiàn)插件化架構(gòu)的4種實(shí)現(xiàn)方案吧2025-05-05

