Spring 3.1缓存和@Cacheable

缓存在软件领域已经存在很长时间了。 它们是那些真正有用的东西之一,一旦您开始使用它们,您会想知道如果没有它们,您是如何相处的,所以似乎让Spring的家伙们只是在版本中向Spring核心添加缓存实现有点奇怪。 3.1。 我猜想以前没有被视为优先事项,此外,在引入Java批注之前,缓存的困难之一是将缓存代码与业务代码耦合在一起,这通常会变得很混乱。

但是,Spring的家伙现在已经基于几个注释设计了一个易于使用的缓存系统:@Cacheable和@CacheEvict。

@Cacheable批注的想法是,您可以使用它来标记将存储在缓存中的方法返回值。 @Cacheable批注可以应用于方法级别或类型级别。 在方法级别应用时,将对带注释的方法的返回值进行缓存。 在类型级别应用时,将缓存每个方法的返回值。

下面的代码演示了如何在类型级别应用@Cacheable:

@Cacheable(value = "employee")
public class EmployeeDAO {public Person findEmployee(String firstName, String surname, int age) {return new Person(firstName, surname, age);}public Person findAnotherEmployee(String firstName, String surname, int age) {return new Person(firstName, surname, age);}
}

Cacheable批注采用三个参数:value(必填)以及key和condition。 其中第一个(值)用于指定存储a方法的返回值的一个或多个缓存的名称。

@Cacheable(value = "employee")public Person findEmployee(String firstName, String surname, int age) {return new Person(firstName, surname, age);}

上面的代码确保新的Person对象存储在“员工”缓存中。

缓存中存储的任何数据都需要一个密钥来快速检索。 默认情况下,Spring使用注释方法的签名创建缓存密钥,如上面的代码所示。 您可以使用@Cacheable的第二个参数:key覆盖它。 要定义自定义键,请使用SpEL表达式。

@Cacheable(value = "employee", key = "#surname")public Person findEmployeeBySurname(String firstName, String surname, int age) {return new Person(firstName, surname, age);}

在findEmployeeBySurname(…)代码中,“#surname”字符串是SpEL表达式,表示“使用findEmployeeBySurname(…)方法的surname参数创建并创建密钥”。

最后的@Cacheable参数是可选的条件参数。 同样,这引用了SpEL表达式,但是这次它指定了一个条件,该条件用于确定是否将方法的返回值添加到缓存中。

@Cacheable(value = "employee", condition = "#age < 25")public Person findEmployeeByAge(String firstName, String surname, int age) {return new Person(firstName, surname, age);}

在上面的代码中,我应用了可笑的业务规则,即如果雇员不到25岁,则仅缓存Person对象。

快速演示了如何应用某些缓存后,接下来要做的就是看一看所有含义。

@Testpublic void testCache() {Person employee1 = instance.findEmployee("John", "Smith", 22);Person employee2 = instance.findEmployee("John", "Smith", 22);assertEquals(employee1, employee2);}

上面的测试演示了最简单的缓存。 第一次调用findEmployee(...),结果尚未缓存,因此将调用我的代码,Spring将其返回值存储在缓存中。 在对findEmployee(...)的第二次调用中,未调用我的代码,Spring返回了缓存的值; 因此,局部变量employee1引用了与employee2相同的对象引用,这意味着以下情况成立:

assertEquals(employee1, employee2);

但是,事情并非总是那么清晰。 记住,在findEmployeeBySurname中,我已经修改了缓存密钥,以便使用surname参数创建密钥,而在创建自己的密钥算法时要注意的事情是确保任何密钥都引用唯一的对象。

@Testpublic void testCacheOnSurnameAsKey() {Person employee1 = instance.findEmployeeBySurname("John", "Smith", 22);Person employee2 = instance.findEmployeeBySurname("Jack", "Smith", 55);assertEquals(employee1, employee2);}

上面的代码找到了两个Person实例,这些实例显然指向不同的员工; 但是,由于我只缓存姓氏,因此Spring将返回对我第一次调用findEmployeeBySurname(…)时创建的对象的引用。 对于Spring来说这不是问题,但是由于我的缓存键定义不佳。

当引用由将条件应用于@Cachable注释的方法创建的对象时,必须采取类似的措施。 在我的示例代码中,我应用了仅缓存员工年龄在25岁以下的Person实例的任意条件。

@Testpublic void testCacheWithAgeAsCondition() {Person employee1 = instance.findEmployeeByAge("John", "Smith", 22);Person employee2 = instance.findEmployeeByAge("John", "Smith", 22);assertEquals(employee1, employee2);}

在上面的代码中,对employee1和employee2的引用是相等的,因为在第二次调用findEmployeeByAge(...)时,Spring返回其缓存的实例。

@Testpublic void testCacheWithAgeAsCondition2() {Person employee1 = instance.findEmployeeByAge("John", "Smith", 30);Person employee2 = instance.findEmployeeByAge("John", "Smith", 30);assertFalse(employee1 == employee2);}

同样,在上面的单元测试代码中,对employee1和employee2的引用引用了不同的对象,在这种情况下,John Smith已超过25岁。

这仅涉及@Cacheable,但是@CacheEvict和清除缓存中的项目呢? 另外,还有一个问题,就是在您的Spring配置中添加缓存并选择合适的缓存实现。 但是,稍后会有更多……。

参考:来自Captain Debug's Blog博客的JCG合作伙伴 Roger Hughes的Spring 3.1 Caching和@Cacheable 。


翻译自: https://www.javacodegeeks.com/2012/09/spring-31-caching-and-cacheable.html

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

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

相关文章

pytorchyolov4训练_使用pytorch-yolov5 訓練自己的數據集-2020.6.15

make yolov5 pytorch train datasets训练所需环境 python3.5, pytorch1.3, torchvision 0.4.1 , tensorboard 1.14.0 , tensorflow-gpu1.14.0本例制作yolov5数据集 并进行数据训练从VOC数据集转为训练所需的coco数据集代码有待改进包含文件夹voc2coco/(Annotations/ JPEGImages…

meta 的作用 搜集

Meta标签中的format-detection属性及含义 format-detection翻译成中文的意思是“格式检测”&#xff0c;顾名思义&#xff0c;它是用来检测html里的一些格式的&#xff0c;那关于meta的format-detection属性主要是有以下几个设置&#xff1a;<meta name"format-detecti…

Web服务安全性和SOA路线图的人为维度

在大多数非平凡的SOA环境中&#xff0c;很难跟踪系统之间不断发展的集成&#xff0c;除非有明确的发布和查找适当信息的方法。 概述IT环境&#xff0c;定义当前或将要连接的内容&#xff0c;是维护环境的先决条件。 缺少这种情况通常会导致“面向意大利面条的环境”的感觉&…

pccad自定义图框_(PCCAD自定义标题栏详细方法.doc

PCCAD2011自定义标题栏详细方法下面以图3-1为例说明标题栏的自定义过程。图3-11&#xff0e;新建文件(用New 命令)。2&#xff0e;用绘图和文字中的相关命令设计出图3-1所示的图形。其中在使用中不变的内容&#xff0c;如厂名等均用“文字”命令标出&#xff0c;而需临时填充的…

ThinkPHP 3.2.x 集成极光推送指北

3.2版本已经过了维护生命周期&#xff0c;官方已经不再维护&#xff0c;请及时更新至5.0版本 —— ThinkPHP 官方仓库 以上&#xff0c;如果有条件&#xff0c;请关闭这个页面&#xff0c;然后升级至 ThinkPHP 5&#xff0c;如果由于各种各样的原因无法升级至 TP 5 &#xff0c…

Java:选择正确的集合

这是在应用程序中选择Set &#xff0c; List或Map的正确实现的快速指南。 最好的通用或“主要”实现可能是ArrayList&#xff0c;LinkedHashMap和LinkedHashSet。 它们的整体性能更好&#xff0c;除非您需要其他实现提供的特殊功能&#xff0c;否则应使用它们。 该特殊功能通常…

Java多线程——不变性与安全发布

1、不变性 某个对象在被创建后其状态就不能被修改&#xff0c;那么这个对象就称为不可变对象&#xff0c;不可变对象一定是线程安全的。不可变对象很简单。他们只有一种状态&#xff0c;并且该状态由构造函数来控制。 当满足以下条件时&#xff0c;对象才是不可变的&#xff1a…

中tr不能显示字符_垃圾文本识别中基本操作指南和错误总结,第三部分

创建模型需要用到机器学习的库&#xff0c;所以我们先下载sklearn库sklearn库下载完成后再输入库文件&#xff0c;就可以完美运行。然后就是划分测试集和训练集&#xff0c;需要注意的是&#xff0c;在从数据处理函数中导入数据时&#xff0c;足足运行了有将近30多秒&#xff0…

mvc后台post发送json数据

代码比较简单&#xff0c;不废话&#xff0c;直接上代码&#xff1a; /// <summary>/// 提交json数据&#xff0c;并接收/// </summary>/// <param name"apipath">要请求的服务器地址</param>/// <param name"jsonStr">要提…

(转载)20分钟读懂程序集

转自&#xff1a;http://www.cnblogs.com/damonlan/p/3221347.html 说到程序集&#xff0c;我刚开始对这个名词特别的郁闷&#xff01;~。然后 前些天花了些时间 好好读了一下&#xff0c;现在比较清晰了&#xff0c;把一些书上看到的 记下来&#xff0c;以飨读者。希望没浪费你…

大数据胸_喂母乳会导致胸下垂?!你被这个谣言骗了多少年?

很多人认为&#xff0c;给宝宝喂奶会导致胸下垂。有些爱美的妈妈&#xff0c;甚至在宝宝出生6个月后就着急断奶。那么&#xff0c;喂奶真的会导致胸下垂么&#xff1f;给大家讲两个真实的调查结果哈~2004年的一次针对496名新妈妈的调查结果显示&#xff0c;有75%的母乳喂养母亲…

Spring Shell项目发布

Spring Source昨天发布了Spring Shell 。 Spring Shell是一个交互式Shell&#xff0c;可以使用基于Spring的编程模型轻松地通过命令进行扩展。 它是通过除去OSGi依赖项从Spring Roo项目中提取的&#xff0c;并变成了一个独立项目。 这使得那些只希望使用交互式外壳功能的人更容…

自制ACL+DHCP实验(初版)

&#xff08;实验用gns模拟器&#xff09; ACL 实验拓扑&#xff1a; 实验要求&#xff1a; 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤&#xff1a; 步骤一&#xff1a;基本配置 R1&#xff1a; R1#conf t R1(config)#int lo0 R1(config-if…

pil 图像最大值_第97天:图像库 PIL(二)

上节我们讲了 Python 的图像处理库 PIL 的基本图像处理功能&#xff0c;打开了 PIL 的神秘面纱。这节我们接着讲 PIL 的 Image 模块的常用方法。Image 模块的方法convertImage.convert(modeNone, matrixNone, ditherNone, palette0, colors256)参数说明&#xff1a;mode&#x…

c#的委托用法delegate

转载于:https://www.cnblogs.com/douzujun/p/6555886.html

yii2.0

yii是一个高性能的适用于开发web2.0应用的框架&#xff0c;它自带丰富的功能&#xff0c;包括mvc&#xff0c;dao/aciverecord&#xff0c;缓存&#xff0c;身份验证和基于角色的访问控制&#xff0c;脚手架&#xff0c;测试等&#xff0c;可显著缩短开发时间yii只加载你需要的…

Java中常见的代码冲突

在工作中&#xff0c;最近我对现有Java项目进行了代码清理。 完成该练习后&#xff0c;我可以看到在代码中一次又一次地发生了一组常见的代码冲突。 因此&#xff0c;我想出了此类常见违规的清单&#xff0c;并与同行分享&#xff0c;以使人们有意识地提高代码质量和可维护性。…

np读取csv文件_被 Pandas read_csv 坑了

-- 不怕前路坎坷&#xff0c;只怕从一开始就走错了方向Pandas 是python的一个数据分析包&#xff0c;纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。Pandas 就是为解决数据分析任务生的&#xff0c;无论是数据分析还是机器学习项目数据预…

Python 第三方库 cp27、cp35 等文件名的含义

What does version name ‘cp27’ or ‘cp35’ mean in Python? 如对于 gensim-0.12.4-cp27-none-win_amd64.whl文件名而言&#xff0c;将其文件名拆分的话&#xff0c;含义分别是&#xff1a; 0.12.4 - package version, they may be using semantic versioningcp27 - this p…

JAVA: 序列化

对象序列化 - 一个对象可以被表示为一个字节序列&#xff0c;保存对象的类型信息、对象的数据&#xff0c;还有对象中的数据类型&#xff0c;以便存储或传输。 反序列化 - 将序列化对象写入文件之后&#xff0c;可以从文件中读取出来&#xff0c;并且对它进行反序列化&#xff…