@CacheConfig??當前類中所有緩存方法詳解

@CacheConfig??當前類中所有緩存方法詳解

在 Spring Cache 抽象中,@CacheConfig 是一個??類級別注解??,用于為??當前類中的所有緩存方法(如 @Cacheable@CachePut@CacheEvict)提供默認配置??。其核心作用是??避免在每個方法上重復聲明相同的緩存參數??,提升代碼簡潔性和可維護性。

??一、核心屬性與應用場景??

@CacheConfig 支持以下核心屬性,用于定義類級別緩存的默認行為:

屬性類型是否必填說明
cacheNamesString[]緩存名稱的默認值(逗號分隔)。若方法注解未顯式指定 value/cacheNames,則使用此配置。
keyGeneratorString鍵生成器的 Bean 名稱(默認使用 SimpleKeyGenerator)。
cacheManagerString緩存管理器的 Bean 名稱(默認使用全局配置的 cacheManager)。
keyPrefixString緩存鍵的前綴(Spring 4.3+ 支持,優先級高于 keyGenerator 中的默認前綴邏輯)。
conditionString類級別緩存方法的全局條件(SpEL 表達式,僅當方法滿足條件時生效)。
unlessString類級別緩存方法的全局排除條件(SpEL 表達式,滿足條件時不緩存結果)。

??二、典型使用場景??

@CacheConfig 適用于??同一類中多個緩存方法需要共享相同配置??的場景,例如:

  • 同一類中所有緩存操作使用相同的緩存名稱(如 userCache)。
  • 同一類中所有緩存方法使用自定義的鍵生成策略。
  • 同一類中所有緩存方法需要統一的緩存管理器(如切換不同緩存實現)。

??三、具體用法示例??

??示例 1:統一緩存名稱??

假設一個 UserService 類中所有緩存方法都使用 userCache 作為緩存名稱,可通過 @CacheConfig(cacheNames = "userCache") 統一聲明,避免每個方法重復寫 value = "userCache"

@Service
@CacheConfig(cacheNames = "userCache") // 類級別統一緩存名稱
public class UserService {// 方法 1:使用類級別的 cacheNames(無需顯式聲明 value)@Cacheable(key = "#userId")public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}// 方法 2:顯式聲明 cacheNames 會覆蓋類級別配置(可選)@Cacheable(value = "profileCache", key = "#userId")public UserProfile getUserProfile(Long userId) {return profileRepository.findById(userId).orElse(null);}
}
??示例 2:自定義鍵生成器??

若需要為類中所有緩存方法使用自定義的鍵生成邏輯(如拼接多個參數),可通過 keyGenerator 指定自定義的鍵生成器 Bean。

??步驟 1:定義自定義鍵生成器??

@Component("customKeyGenerator")
public class CustomKeyGenerator implements KeyGenerator {@Overridepublic Object generate(Object target, Method method, Object... params) {// 自定義鍵格式:類名::方法名::參數1::參數2...return String.format("%s::%s::%s", target.getClass().getSimpleName(), method.getName(), Arrays.toString(params));}
}

??步驟 2:在類上通過 @CacheConfig 引用??

@Service
@CacheConfig(cacheNames = "userCache",keyGenerator = "customKeyGenerator" // 使用自定義鍵生成器
)
public class UserService {@Cacheablepublic User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}@Cacheablepublic User updateUser(Long userId, User newUser) {return userRepository.save(newUser);}
}

此時,兩個方法的緩存鍵會自動生成為:

  • getUserById::[123](假設 userId=123
  • updateUser::[123, User{id=123,...}]
??示例 3:統一緩存管理器??

若應用需要為不同緩存類型(如本地緩存和分布式緩存)配置不同的緩存管理器,可通過 cacheManager 指定類級別的緩存管理器。

??步驟 1:配置多個緩存管理器??

@Configuration
public class CacheConfig {// 本地緩存管理器(Caffeine)@Beanpublic CacheManager caffeineCacheManager() {CaffeineCacheManager manager = new CaffeineCacheManager();manager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES));return manager;}// 分布式緩存管理器(Redis)@Beanpublic CacheManager redisCacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1));return RedisCacheManager.builder(factory).cacheDefaults(config).build();}
}

??步驟 2:在類上指定緩存管理器??

@Service
@CacheConfig(cacheManager = "redisCacheManager") // 使用 Redis 緩存管理器
public class UserService {@Cacheable(key = "#userId")public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}
}
??示例 4:全局條件與排除條件??

通過 conditionunless 可以為類中所有緩存方法設置全局生效條件。

@Service
@CacheConfig(cacheNames = "userCache",condition = "#userId != null", // 僅當 userId 非空時緩存unless = "#result == null"      // 結果為 null 時不緩存
)
public class UserService {@Cacheable(key = "#userId")public User getUserById(Long userId) {return userRepository.findById(userId).orElse(null);}
}

此時,若 userIdnull 或查詢結果為 null,則不會觸發緩存操作。

??四、注意事項??

  1. ??作用范圍限制??
    @CacheConfig 僅對當前類中聲明的緩存方法(@Cacheable@CachePut@CacheEvict)有效,對子類或兄弟類的方法無影響。

  2. ??方法級注解優先級更高??
    若方法級別的緩存注解(如 @Cacheable(value = "profileCache"))顯式聲明了某個屬性(如 value),則??方法級配置會覆蓋類級別的默認配置??。

  3. ??屬性沖突處理??

    • cacheNames:方法級未聲明時使用類級別;方法級聲明時覆蓋類級別。
    • keyGenerator/cacheManager:方法級未聲明時使用類級別;方法級聲明時覆蓋類級別。
    • condition/unless:類級別條件與方法級別條件為??邏輯與(AND)關系??(即兩者都滿足時才生效)。
  4. ??適用 Spring 版本??
    @CacheConfig 自 Spring 3.2 引入,所有 Spring Boot 1.x 及以上版本均支持。

??五、總結??

@CacheConfig 是 Spring Cache 中用于??類級別緩存配置復用??的核心注解,通過它可以統一管理同一類中所有緩存方法的公共參數(如緩存名稱、鍵生成策略、緩存管理器等),顯著減少重復代碼,提升可維護性。結合方法級注解的靈活性,能夠高效應對不同業務場景的緩存需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92738.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正確使用SQL Server中的Hint(10)—Hint簡介與Hint分類及語法(1)

9.5. 正確使用Hint 9.5.1. Hint簡介 與Oracle等其他關系庫類似,SQL Server中,也提供了諸多Hint用于支持SQL調優,那就是通過正確應用Hint技術,可以指示CBO為SQL語句產生和選擇最合理而高效的查詢計劃。Hint確實可以做到很容易的對CBO產生影響,但因為多數場景中,CBO都能為…

Redis的分布式序列號生成器原理

Redis 分布式序列號生成器的核心原理是利用 Redis 的原子操作和高性能特性,在分布式系統中生成全局唯一、有序的序列號。其設計通常結合業務需求(如有序性、長度限制、高并發),通過 Redis 的原子命令(如 INCR、INCRBY&…

2025年SEVC SCI2區,基于深度強化學習與模擬退火的多無人機偵察任務規劃,深度解析+性能實測

目錄1.摘要2.問題定義3.SA-NNO-DRL方法4.結果展示5.參考文獻6.算法輔導應用定制讀者交流1.摘要 無人機(UAV)因其高自主性和靈活性,廣泛應用于偵察任務,多無人機任務規劃在交通監控和數據采集等任務中至關重要,但現有方…

汽車娛樂信息系統域控制器的網絡安全開發方案

引言1.1 項目背景隨著汽車行業的快速發展和智能化、網聯化的趨勢日益明顯,汽車娛樂信息系統(In-Vehicle Infotainment System,IVIS)已經成為現代汽車的重要組成部分。汽車娛樂信息系統不僅提供了豐富的多媒體功能,如音…

【論文閱讀】Deep Adversarial Multi-view Clustering Network

摘要多視圖聚類通過挖掘多個視圖之間的共同聚類結構,近年來受到了越來越多的關注。現有的大多數多視圖聚類算法使用淺層、線性嵌入函數來學習多視圖數據的公共結構。然而,這些方法無法充分利用多視圖數據的非線性特性,而這種特性對于揭示復雜…

Redis - 使用 Redis HyperLogLog 進行高效基數統計

文章目錄引言HyperLogLog 工作原理Spring Boot 集成 Redis1. 添加依賴2. 配置 Redis 連接3. Redis 配置類HyperLogLog 實戰應用1. 基礎操作服務類2. 網站日活躍用戶統計3. 性能測試與誤差分析應用場景分析適用場景不適用場景性能優化技巧與傳統方案對比結論引言 在數據分析和監…

後端開發技術教學(三) 表單提交、數據處理

上回:後端開發技術教學(二) 條件指令、循環結構、定義函數 -CSDN博客 必要資源: trae中文版下載網址: TRAE - The Real AI Engineer phpStudy 2018 : phpStudy - Windows 一鍵部署 PHP 開發環境 小皮出品 目錄 一、表單提交 1.1 get & post 1.…

Python訓練Day39

浙大疏錦行 圖像數據的格式:灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 一、 圖像數據的介紹 圖像數據,相較于結構化數據(表格數據)他的特…

十八、MySQL-DML-數據操作-插入(增加)、更新(修改)、刪除

DML數據操作添加數據更新(修改)數據刪除數據總結代碼: -- DML:數據操作語言-- -- DML:插入數據-insert -- 1.為tb_emp表的username,name,gender 字股插入值insert into tb_emp(username,name,gender,create_time,update_time) values (Toki,小時,2,now()…

Linux 安裝 JDK 8u291 教程(jdk-8u291-linux-x64.tar.gz 解壓配置詳細步驟)?

一、準備工作 ?下載 JDK 安裝包? 去 Oracle 官網或者可信的鏡像站下載: ?jdk-8u291-linux-x64.tar.gz? (這是一個壓縮包,不是安裝程序,解壓就能用) ?jdk-8u291-linux-x64.tar.gz?下載鏈接:https://pa…

藍橋杯----鎖存器、LED、蜂鳴器、繼電器、Motor

(七)、鎖存器1、原理藍橋杯中數據傳入口都是P0,也就是數碼管段選、位選數據、LED亮滅的數據、蜂鳴器啟動或禁用的數據,外設啟動或者關閉都需要通過P0寫入數據,那么如何這樣共用一個端口會造成沖突嘛,答案是肯定的。所以藍橋杯加入…

AI熱點周報(8.3~8.9):OpenAI重返開源,Anthropic放大招,Claude4.1、GPT5相繼發布

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄一、OpenAI的"開源回歸":時隔5年的戰略大轉彎1. GPT-OSS系列&a…

《Kubernetes部署篇:基于x86_64+aarch64架構CPU+containerd一鍵離線部署容器版K8S1.33.3高可用集群》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:企業級K8s集群運維實戰 一、部署背景 由于業務系統的特殊性,我們需要針對不同的客戶環境部署基于containerd容器版 K8S 1.33.3集群&a…

Linux抓包命令tcpdump詳解筆記

文章目錄一、tcpdump 是什么?二、基本語法三、常用參數說明四、抓包示例(通俗易懂)1. 抓所有數據包(默認 eth0)2. 指定接口抓包3. 抓取端口 80 的數據包(即 HTTP 請求)4. 抓取訪問某個 IP 的數據…

抖音、快手、視頻號等多平臺視頻解析下載 + 磁力嗅探下載、視頻加工(提取音頻 / 壓縮等)

跟你們說個安卓上的下載工具,還挺厲害的。它能支持好多種下載方式,具體多少種我沒細數,反正挺全乎的。? 平時用得最多的就是視頻解析,像抖音、快手、B 站上那些視頻,想存下來直接用它就行,連海外視頻的也能…

【iOS】JSONModel源碼學習

JSONModel源碼學習前言JSONModel的使用最基礎的使用轉換屬性名稱自定義錯誤模型嵌套JSONModel的繼承源碼實現initWithDictionaryinit__doesDictionaryimportDictionary優點前言 之前了解過JSONModel的一些使用方法等,但是對于底層實現并不清楚了解,今天…

SmartMediaKit 模塊化音視頻框架實戰指南:場景鏈路 + 能力矩陣全解析

?? 引言:從“內核能力”到“模塊體系”的演進 自 2015 年起,大牛直播SDK(SmartMediaKit)便致力于打造一個可深度嵌入、跨平臺兼容、模塊自由組合的實時音視頻基礎能力框架。經過多輪技術迭代與場景打磨,該 SDK 已覆…

【第5話:相機模型1】針孔相機、魚眼相機模型的介紹及其在自動駕駛中的作用及使用方法

相機模型介紹及相機模型在自動駕駛中的作用及使用方法 相機模型是計算機視覺中的核心概念,用于描述真實世界中的點如何投影到圖像平面上。在自動駕駛系統中,相機模型用于環境感知,如物體檢測和場景理解。下面我將詳細介紹針孔相機模型和魚眼相…

推薦一款優質的開源博客與內容管理系統

Halo是一款由Java Spring Boot打造的開源博客與內容管理系統(CMS),在 GitHub上擁有超過36K Start的活躍開發者社區。它使用GPL?3.0授權開源,穩定性與可維護性極高。 Halo的設計簡潔、注重性能,同時保持高度靈活性&a…

【GPT入門】第43課 使用LlamaFactory微調Llama3

【GPT入門】第43課 使用LlamaFactory微調Llama31.環境準備2. 下載基座模型3.LLaMA-Factory部署與啟動4. 重新訓練![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/e7aa869f8e2c4951a0983f0918e1b638.png)1.環境準備 采購autodl服務器,24G,GPU,型號3090&am…