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

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

到此這篇關(guān)于Spring全家桶中@CacheEvict無效情況的問題解決的文章就介紹到這了,更多相關(guān)Spring @CacheEvict無效情況內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談SpringMVC中Interceptor和Filter區(qū)別
這篇文章主要介紹了淺談SpringMVC中Interceptor和Filter區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧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ù)時出現(xiàn)java.sql.SQLSyntaxErrorException異常,本文就來介紹一下MyBatis異常的問題解決,具有一定的參考價值,感興趣的可以了解一下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ǔ),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
Java7到Java17之Switch語句進(jìn)化史示例詳解
這篇文章主要為大家介紹了Java7到Java17之Switch語句進(jìn)化史示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

