Spring?Cache注解@Cacheable的九個屬性詳解
1.value/cacheNames 屬性
如下圖所示,這兩個屬性代表的意義相同,根據(jù)@AliasFor注解就能看出來了。這兩個屬性都是用來指定緩存組件的名稱,即將方法的返回結果放在哪個緩存中,屬性定義為數(shù)組,可以指定多個緩存;

//這兩種配置等價 @Cacheable(value = "user") //@Cacheable(cacheNames = "user") User getUser(Integer id);
2.key屬性
可以通過 key 屬性來指定緩存數(shù)據(jù)所使用的的 key,默認使用的是方法調用傳過來的參數(shù)作為 key。最終緩存中存儲的內容格式為:Entry<key,value> 形式。
- 如果請求沒有參數(shù):
key=new SimpleKey(); - 如果請求有一個參數(shù):
key=參數(shù)的值 - 如果請求有多個參數(shù):
key=newSimpleKey(params);(你只要知道 key不會為空就行了)
key值的編寫,可以使用 SpEL 表達式的方式來編寫;除此之外,我們同樣可以使用 keyGenerator 生成器的方式來指定 key,我們只需要編寫一個 keyGenerator ,將該生成器注冊到 IOC 容器即可。(keyGenerator的使用,繼續(xù)往下看)
| 名字 | 位置 | 描述 | 示例 |
|---|---|---|---|
| methodName | root object | 當前被調用的方法名 | #root.method.name |
| method | root object | 當前被調用的方法 | #root.methodName |
| target | root object | 當前被調用的目標對象 | #root.target |
| targetClass | root object | 當前被調用的目標對象類 | #root.targetClass |
| args | root object | 當前被調用的方法的參數(shù)列表 | #root.args[0] |
| caches | root object | 當前方法調用使用的緩存列表(如@Cacheable(value={“cache1”,“cache2”})),則有兩個cache | #root.caches[0].name |
| argument name | evaluation context | 方法參數(shù)的名字. 可以直接 #參數(shù)名 ,也可以使用 #p0或#a0 的形式,0代表參數(shù)的索引; | #id、#p0、#a0 |
| result | evaluation context | 方法執(zhí)行后的返回值(僅當方法執(zhí)行之后的判斷有效,如’unless’、'cache put’的表達式 'cacheevict’的表達式beforeInvocation=false) | #result |
使用示例如下:
@Cacheable(value = "user",key = "#root.method.name") User getUser(Integer id);
3.keyGenerator 屬性
key 的生成器。如果覺得通過參數(shù)的方式來指定比較麻煩,我們可以自己指定 key 的生成器的組件 id。key/keyGenerator屬性:二選一使用。我們可以通過自定義配置類方式,將 keyGenerator 注冊到 IOC 容器來使用。
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
import java.util.Arrays;
@Configuration
public class MyCacheConfig {
@Bean("myKeyGenerator")
public KeyGenerator keyGenerator(){
return new KeyGenerator(){
@Override
public Object generate(Object target, Method method, Object... params) {
return method.getName()+ Arrays.asList(params).toString();
}
};
}
/**
* 支持 lambda 表達式編寫
*/
/*@Bean("myKeyGenerator")
public KeyGenerator keyGenerator(){
return ( target, method, params)-> method.getName()+ Arrays.asList(params).toString();
}*/
}4.cacheManager 屬性
該屬性,用來指定緩存管理器。針對不同的緩存技術,需要實現(xiàn)不同的 cacheManager,Spring 也為我們定義了如下的一些 cacheManger 實現(xiàn)()
| CacheManger | 描述 |
|---|---|
| SimpleCacheManager | 使用簡單的Collection來存儲緩存,主要用于測試 |
| ConcurrentMapCacheManager | 使用ConcurrentMap作為緩存技術(默認) |
| NoOpCacheManager | 測試用 |
| EhCacheCacheManager | 使用EhCache作為緩存技術,以前在hibernate的時候經常用 |
| GuavaCacheManager | 使用google guava的GuavaCache作為緩存技術 |
| HazelcastCacheManager | 使用Hazelcast作為緩存技術 |
| JCacheCacheManager | 使用JCache標準的實現(xiàn)作為緩存技術,如Apache Commons JCS |
| RedisCacheManager | 使用Redis作為緩存技術 |
具體使用介紹,可參考:SpringBoot整合Redis實現(xiàn)數(shù)據(jù)緩存
5.cacheResolver 屬性
該屬性,用來指定緩存管理器。使用配置同 cacheManager 類似,可自行百度。(cacheManager指定管理器/cacheResolver指定解析器 它倆也是二選一使用)
6.condition 屬性
條件判斷屬性,用來指定符合指定的條件下才可以緩存。也可以通過 SpEL 表達式進行設置。這個配置規(guī)則和上面表格中的配置規(guī)則是相同的。
@Cacheable(value = "user",condition = "#id>0")//傳入的 id 參數(shù)值>0才進行緩存 User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1")//傳入的第一個參數(shù)的值>1的時候才進行緩存 User getUser(Integer id);
@Cacheable(value = "user",condition = "#a0>1 and #root.methodName eq 'getUser'")//傳入的第一個參數(shù)的值>1 且 方法名為 getUser 的時候才進行緩存 User getUser(Integer id);
7.unless 屬性
unless屬性,意為"除非"的意思。即只有 unless 指定的條件為 true 時,方法的返回值才不會被緩存。可以在獲取到結果后進行判斷。
@Cacheable(value = "user",unless = "#result == null")//當方法返回值為 null 時,就不緩存 User getUser(Integer id);
@Cacheable(value = "user",unless = "#a0 == 1")//如果第一個參數(shù)的值是1,結果不緩存 User getUser(Integer id);
8.sync 屬性
該屬性用來指定是否使用異步模式,該屬性默認值為 false,默認為同步模式。異步模式指定 sync = true 即可,異步模式下 unless 屬性不可用。
到此這篇關于Spring Cache注解@Cacheable的九個屬性詳解的文章就介紹到這了,更多相關@Cacheable注解屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Springboot的@Cacheable注解使用方法
- 詳解Springboot @Cacheable 注解(指定緩存位置)
- 基于spring?@Cacheable?注解的spel表達式解析執(zhí)行邏輯
- Spring?@Cacheable注解類內部調用失效的解決方案
- spring?cache注解@Cacheable緩存穿透詳解
- Spring @Cacheable注解中key的使用詳解
- Spring緩存注解@Cacheable @CacheEvit @CachePut使用介紹
- 詳解Spring緩存注解@Cacheable,@CachePut , @CacheEvict使用
- spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用
相關文章
Java實現(xiàn)企業(yè)微信消息推送功能的詳細步驟
這篇文章主要介紹了Java實現(xiàn)企業(yè)微信消息推送功能,本文圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04
Java在Linux上調用FFmpeg實現(xiàn)視頻截圖的完整指南
在Linux環(huán)境下使用Java與FFmpeg命令交互進行視頻截圖是多媒體處理中的常見任務,本文介紹了如何在Java程序中執(zhí)行FFmpeg命令,通過提供具體代碼示例來展示在特定時間點獲取視頻靜態(tài)圖像的方法,需要的朋友可以參考下2025-08-08

