@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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…