使用@CacheEvict?多參數(shù)如何匹配刪除
@CacheEvict 多參數(shù)匹配刪除
如果@Cacheable(“XXX”)
Object getXXX(String a, String b, String c);
spring的緩存使用的key是ESPL表達(dá)式,然后翻看源碼key默認(rèn)用的生成方式是org.springframework.cache.interceptor.SimpleKeyGenerator
大于1個參數(shù)走的是最后一個方法
/**
* Generate a key based on the specified parameters.
*/
public static Object generateKey(Object... params) {
if (params.length == 0) {
return SimpleKey.EMPTY;
}
if (params.length == 1) {
Object param = params[0];
if (param != null && !param.getClass().isArray()) {
return param;
}
}
return new SimpleKey(params);
}
然后查看org.springframework.cache.interceptor.SimpleKey對應(yīng)代碼,發(fā)現(xiàn)返回的其實是SimpleKey
/**
* Create a new {@link SimpleKey} instance.
* @param elements the elements of the key
*/
public SimpleKey(Object... elements) {
Assert.notNull(elements, "Elements must not be null");
this.params = new Object[elements.length];
System.arraycopy(elements, 0, this.params, 0, elements.length);
this.hashCode = Arrays.deepHashCode(this.params);
}
解決思路
方案一:單獨寫一個自定義的KeyGenerator
處理對應(yīng)的key。(之前的redis的文章已寫過,所以不重復(fù)寫了)
下面博文的 MyKeyGenerator 這個類
sprintboot使用spring-security包,緩存內(nèi)存與redis共存
方案二:@Cacheable(value=“XXX”, key=“xxxx”)
@CacheEvict(value=“XXX”, key=“xxxx”)
做相應(yīng)的key配置
數(shù)組的話可以使用 key = “#root.args[0]”
參數(shù)參考如下:
| 名字 | 位置 | 描述 | 示例 |
|---|---|---|---|
| methodName | root object | 當(dāng)前被調(diào)用的方法名 | #root.methodName |
| method | root object | 當(dāng)前被調(diào)用的方法 | #root.method .name |
| target | root object | 當(dāng)前被調(diào)用的目標(biāo)對象 | #root.target |
| targetClass | root object | 當(dāng)前被調(diào)用的目標(biāo)對象類 | #root.targetClass |
| args | root object | 當(dāng)前被調(diào)用的方法的參數(shù)列表 | #root.args[0] |
| caches | root object | 當(dāng)前方法調(diào)用使用的緩存列表 | #root.caches[0].name |
| argument name | evaluation context | 方法參數(shù)的名字,可以直接#參數(shù)名,也可以使用#p0或#a0的形式,0代表參數(shù)的索引 | #iban、#a0、#p0 |
| result | evaluation context | 方法執(zhí)行后的返回值 | #result |
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA打開java項目后里面的java文件不能運行解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA打開java項目后里面的java文件不能運行的解決辦法,有時候想運行別人的項目,但是別人的項目并非IDEA項目(甚至只有源碼),當(dāng)我們打開項目時候,并不能運行,需要的朋友可以參考下2023-10-10
MyBatisCodeHelperPro插件下載及使用教程詳解
這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-09-09
SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實現(xiàn)
這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
使用jaxp進(jìn)行dom解析_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了使用jaxp進(jìn)行dom解析的相關(guān)資料,需要的朋友可以參考下2017-08-08
Java關(guān)鍵字詳解之final static this super的用法
this用來調(diào)用目前類自身的成員變量,super多用來調(diào)用父類的成員,final多用來定義常量用的,static定義靜態(tài)變量方法用的,靜態(tài)變量方法只能被類本身調(diào)用,下文將詳細(xì)介紹,需要的朋友可以參考下2021-10-10

