使用@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個(gè)參數(shù)走的是最后一個(gè)方法
/**
* 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對(duì)應(yīng)代碼,發(fā)現(xiàn)返回的其實(shí)是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);
}
解決思路
方案一:?jiǎn)为?dú)寫一個(gè)自定義的KeyGenerator
處理對(duì)應(yīng)的key。(之前的redis的文章已寫過,所以不重復(fù)寫了)
下面博文的 MyKeyGenerator 這個(gè)類
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)對(duì)象 | #root.target |
| targetClass | root object | 當(dāng)前被調(diào)用的目標(biāo)對(duì)象類 | #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 |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA打開java項(xiàng)目后里面的java文件不能運(yùn)行解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA打開java項(xiàng)目后里面的java文件不能運(yùn)行的解決辦法,有時(shí)候想運(yùn)行別人的項(xiàng)目,但是別人的項(xiàng)目并非IDEA項(xiàng)目(甚至只有源碼),當(dāng)我們打開項(xiàng)目時(shí)候,并不能運(yùn)行,需要的朋友可以參考下2023-10-10
JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲
這篇文章主要為大家詳細(xì)介紹了JavaGUI實(shí)現(xiàn)隨機(jī)單詞答題游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
MyBatisCodeHelperPro插件下載及使用教程詳解
這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09
Java 使用線程池執(zhí)行多個(gè)任務(wù)的示例
這篇文章主要介紹了Java 使用線程池執(zhí)行多個(gè)任務(wù)的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
SpringBoot整合Web開發(fā)之Json數(shù)據(jù)返回的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot整合Web開發(fā)其中Json數(shù)據(jù)返回的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
使用jaxp進(jìn)行dom解析_動(dòng)力節(jié)點(diǎn)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

