深入浅出@Cacheable

@Cacheable的使用详解,源码级别解析

在现代的应用程序中,缓存是提高性能和可扩展性的重要组成部分。Spring框架提供了@Cacheable注解来轻松地将方法结果缓存起来,以便在后续调用中快速访问。本文将详细介绍@Cacheable注解的使用方法,并从源码级别解析其实现原理。

@Cacheable注解的使用方法

@Cacheable注解可用于Spring管理的bean中的任何方法上。它可以被用来缓存方法返回的结果。当使用@Cacheable注解时,Spring会在调用方法前检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,而不会执行方法体中的代码。如果缓存中不存在该方法的结果,则会执行方法体中的代码,并将结果存储到缓存中,以便下次调用该方法时可以直接返回缓存中的结果。

下面是@Cacheable注解的使用示例:

@Cacheable(value="users", key="#userId")
public User getUserById(String userId) {// 查询数据库获取用户信息
}

上面的示例中,@Cacheable注解被用于getUserById方法上。其中value属性指定了缓存的名称为“users”,key属性指定了缓存的键为传入的userId参数。当调用getUserById方法时,Spring会先检查名为“users”的缓存中是否已经存在键为userId的结果,如果存在,则直接返回缓存中的结果,否则执行方法体中的代码,并将结果存储到缓存中。

@Cacheable注解还可以使用SpEL表达式来动态地计算缓存的键。例如:

@Cacheable(value="users", key="#user.id")
public User getUserById(User user) {// 查询数据库获取用户信息
}

上面的示例中,key属性使用了SpEL表达式“#user.id”,表示缓存的键为传入参数user对象的id属性值。

@Cacheable注解还支持多个键值对作为缓存的键。例如:

@Cacheable(value="users", key="#userId + '_' + #type")
public User getUserByIdAndType(String userId, String type) {// 查询数据库获取用户信息
}

上面的示例中,key属性使用了两个参数作为键值对,分别是userId和type。

@Cacheable注解还支持condition属性来指定是否进行缓存。例如:

@Cacheable(value="users", key="#userId", condition="#userId.length() < 10")
public User getUserById(String userId) {// 查询数据库获取用户信息
}

上面的示例中,condition属性使用了SpEL表达式“#userId.length() < 10”,表示只有当传入参数userId的长度小于10时才进行缓存。

@Cacheable注解还支持unless属性来指定不进行缓存的条件。例如:

@Cacheable(value="users", key="#userId", unless="#result == null")
public User getUserById(String userId) {// 查询数据库获取用户信息
}

上面的示例中,unless属性使用了SpEL表达式“#result == null”,表示只有当方法返回值不为null时才进行缓存。

@Cacheable注解源码分析

@Cacheable注解是Spring框架中org.springframework.cache.annotation包下的一个注解。它实际上是一个组合注解,包含了@CachePut、@CacheEvict和@Caching三个注解。

当使用@Cacheable注解时,Spring会在运行时动态地生成一个代理对象来拦截目标方法的调用。代理对象会首先检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,否则执行目标方法,并将结果存储到缓存中。

下面是@Cacheable注解的源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Caching(cacheable = @Cacheable)
public @interface Cacheable {Class<?>[] value() default {};String[] cacheNames() default {};String key() default "";String keyGenerator() default "";String cacheManager() default "";String cacheResolver() default "";String condition() default "";String unless() default "";boolean sync() default false;
}

从源码可以看出,@Cacheable注解包含了value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless和sync等属性。

value和cacheNames属性用于指定缓存名称。

key和keyGenerator属性用于指定缓存键。

cacheManager和cacheResolver属性用于指定缓存管理器和缓存解析器。

condition和unless属性用于指定是否进行缓存。

sync属性用于指定是否启用同步模式。

总结

本文详细介绍了@Cacheable注解的使用方法,并从源码级别解析了其实现原理。使用@Cacheable注解可以轻松地将方法结果缓存起来,以提高应用程序的性能和可扩展性。在实际应用开发中,我们可以根据具体需求灵活地配置@Cacheable注解的各种属性来达到最佳效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac Intellij Idea get/set方法快捷键

Control Retrun(回车键) Command n 参考&#xff1a; Mac Intellij Idea get/set方法快捷键-CSDN博客

Android中使用Java操作List集合的方法合集,包括判读是否有重复元素等

1、判断是否有重复元素 List<String> mList new ArrayList<>();//将List转为Set&#xff0c;通过比较大小是否一样&#xff0c;判断是否有重复元素 Set<String> stringSet new HashSet<>(mList); boolean isHasRepeat false; if (mTipBeanList.siz…

Cornerstone for Mac:高效SVN管理的黄金标准

在当今的软件开发领域&#xff0c;版本控制系统是不可或缺的一部分。其中&#xff0c;Subversion&#xff08;SVN&#xff09;是一个广泛使用的版本控制系统&#xff0c;有助于团队协同工作&#xff0c;实现代码的版本管理和追踪。对于Mac用户来说&#xff0c;Cornerstone是一款…

代码随想录打卡第四十四天|● 01 二维背包问题 ●一维背包问题-滚动数组 ● 416. 分割等和子集

什么是01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包的模板 二维dp数组 dp数组的含义 dp[i][j]含义下标为【0-i】之间…

【Linux】进程概念与进程状态

文章目录 一、进程概念1.进程的概念2.进程的描述-PCB 二、进程相关的基本操作1.组织进程2.查看进程3.结束进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork初识 三、进程状态1.普遍操作系统层面的进程状态2.Linux操作系统的进程状态 四、两种特殊的进程状态1.僵尸…

C++ 01.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是用汇编语言编写的随着UNIX系统的发展&#xff0c;汇编语言的开发效率成为瓶颈&#xff0c;所以需要一个新的语言替代汇编语言1971年通过对B语言改良&#xff0c;使其能直接产生机器代码&#xff0c;C语言诞生UNIX使用C语言重写&#xff0c;同时…

ESP32网络开发实例-Web显示传感器实时数据

Web显示传感器实时数据 文章目录 Web显示传感器实时数据1、软件准备2、硬件准备3、代码实现3.1 Web页面代码实现4.2 Web服务器代码实现本文将详细介绍如何使用ESP32在 Web 服务器上绘制传感器读数(温度、湿度和压力)。 ESP32 将托管一个网页,其中包含三个实时图表,每 30 秒…

华为OD 字符串消除(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…

Excel文件带有密码的只读模式,如何设置?

Excel带有密码的除了打开密码和工作表保护以外&#xff0c;其实还有一种可以设置密码的方法&#xff0c;今天给大家分享如何设置带有密码的只读模式。 打开excel文件&#xff0c;将文件进行【另存为】设置&#xff0c;然后停留在保存路径的界面中&#xff0c;我们点击下面的工…

《java 桌面软件开发》swing 以鼠标为中心放大缩小移动图片

swing 使用Graphic2D 绘制图片&#xff0c;要实现对图片进行缩放和自由拖动。 1.以鼠标所在的位置为中心&#xff0c;滚轮控制缩放 2.缩放后再支持鼠标拖动。 基本原理&#xff1a; 利用scale() 函数。进行缩放。但是要注意的地方是&#xff0c;如果是在 public void paintCom…

未来装备探索:数字孪生装备

源自&#xff1a;《计算机集成制造系统》 作者&#xff1a;陶飞 张辰源 张贺 程江峰 邹孝付 徐慧 王勇 谢兵兵 “人工智能技术与咨询” 发布 摘 要 工程装备、制造装备、医疗装备等各类装备是加快国家基础建设&#xff0c;提升国家经济实力和保障医疗健康的重要…

2023年【电工(高级)】报名考试及电工(高级)模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【电工&#xff08;高级&#xff09;】报名考试及电工&#xff08;高级&#xff09;模拟考试题&#xff0c;包含电工&#xff08;高级&#xff09;报名考试答案和解析及电工&#xff08;高级&#xff09;模拟考…

[题] 试除法判定质数 #质数(素数) #试除法

题目 AcWing 866. 试除法判定质数 思路 首先是暴力枚举 时间&#xff1a;O( (n) )&#xff09; bool is_prime(int n){//朴素判定&#xff08;暴力&#xff09;if(n < 2) return 0;//小于2的数不在范围内&#xff0c;直接排除for(int i 2; i < n; i )//枚举从2到n-1if(…

JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

基于水基湍流优化的BP神经网络(分类应用) - 附代码

基于水基湍流优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于水基湍流优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.水基湍流优化BP神经网络3.1 BP神经网络参数设置3.2 水基湍流算法应用 4.测试结果…

【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

文章目录 鼠标绘图轨迹栏做调色板图像的基本操作 鼠标绘图 在OpenCV中操作鼠标事件 函数&#xff1a;cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先&#xff0c;我们需要创建一个鼠标回调函数&#xff0c;该函数会在鼠标事件发生时执行。鼠标事件包括左键按下…

Excel 导出打不开

$filename iconv("UTF-8", "GB2312//IGNORE", 志愿者列表) . - . date(YmdHis) . .xlsx; header(Content-Type: application/vnd.ms-excel); header(Content-Disposition: attachment;filename".$filename."); header(Cache-Control: max-age0)…

laravel框架的优缺点是什么?

laravel框架 使用了大量设计模式&#xff0c;框架完全符合设计模式的五大基本原则&#xff08;面向对象设计模式有5大基本原则&#xff1a;单一职责原则、开发封闭原则、依赖倒置原则、接口隔离原则、Liskov替换原则。&#xff09;&#xff0c;模块之间耦合度很低&#xff0c;…

C++QT---QT-day3

#include "widget.h" #include "ui_widget.h" //需要在.pro文件第一行加 texttospeechWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->lineEdit->setPlaceholderText("时:分:秒");//设…

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…