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)文章
淺談SpringMVC中Interceptor和Filter區(qū)別
這篇文章主要介紹了淺談SpringMVC中Interceptor和Filter區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
MyBatis常用標(biāo)簽以及使用技巧總結(jié)
在我們的學(xué)習(xí)過程中,我們經(jīng)常使用到mybatis,這篇文章主要給大家介紹了關(guān)于MyBatis常用標(biāo)簽以及使用技巧的相關(guān)資料,需要的朋友可以參考下2021-05-05
MyBatis異常java.sql.SQLSyntaxErrorException的問題解決
使用mybatis插入數(shù)據(jù)時(shí)出現(xiàn)java.sql.SQLSyntaxErrorException異常,本文就來介紹一下MyBatis異常的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱為Virtual extension methods—虛擬擴(kuò)展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01
java并發(fā)編程之進(jìn)程和線程調(diào)度基礎(chǔ)詳解
這篇文章主要介紹了java并發(fā)編程之進(jìn)程和線程調(diào)度基礎(chǔ),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
詳解Java實(shí)現(xiàn)簡(jiǎn)單SPI流程
這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單SPI流程,SPI英文全稱為Service Provider Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開發(fā)者”使用的接口2023-03-03
Java7到Java17之Switch語句進(jìn)化史示例詳解
這篇文章主要為大家介紹了Java7到Java17之Switch語句進(jìn)化史示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

