Spring 3.1缓存和@CacheEvict

我的上一个博客演示了Spring 3.1的@Cacheable批注的应用, @Cacheable批注用于标记返回值将存储在缓存中的方法。 但是, @Cacheable只是Spring的Guy为缓存而设计的一对注释​​中的一个,另一个是@CacheEvict

@Cacheable一样, @CacheEvict具有valuekeycondition属性。 它们的工作方式与@Cacheable支持的方式@Cacheable ,因此有关它们的更多信息,请参见我以前的博客: Spring 3.1 Caching和@Cacheable 。

CacheEvict支持两个附加属性: allEntriesbeforeInvocation 。 如果我是一个赌博的人,我会花钱买最受欢迎的allEntriesallEntries用于完全清除@CacheEvict的强制value参数定义的高速缓存的内容。 下面的方法演示了如何应用allEntries

@CacheEvict(value = "employee", allEntries = true)public void resetAllEntries() {// Intentionally blank}

resetAllEntries()@CacheEvictallEntries属性设置为“ true”,并假定findEmployee(...)方法如下所示:

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

…然后在下面的代码resetAllEntries() ,将清除“员工”缓存。 这意味着在JUnit测试中, employee1下面不会引用与employee2相同的对象:

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

第二个属性是beforeInvocation 。 这确定在调用方法之前或之后是否从缓存中清除数据项。

下面的代码非常荒谬。 但是,它确实表明您可以同时将@CacheEvict@Cacheable应用于方法。

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

在上面的代码中, @CacheEvict会在@Cacheable搜索缓存之前,使用匹配的键删除缓存中的所有条目。 由于@Cacheable找不到任何条目,因此它将调用我的代码,将结果存储在缓存中。 对我的方法的后续调用将调用@CacheEvict ,它将删除任何适当的条目,结果是在JUnit测试中变量下的employee1将永远不会引用与employee2相同的对象:

@Testpublic void testBeforeInvocation() {Person employee1 = instance.evictAndFindEmployee("John", "Smith", 22);Person employee2 = instance.evictAndFindEmployee("John", "Smith", 22);assertNotSame(employee1, employee2);}

就像我在上面说的那样,由于我将@Cacheable@CacheEvict@Cacheable同一方法, evictAndFindEmployee(...)似乎有点荒谬。 但是,更重要的是,它使代码不清楚并违反了单一责任原则。 因此,我建议创建单独的可缓存和缓存退出方法。 例如,如果您有一个缓存方法,例如:

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

然后,假设您需要比简单的“清除所有”更好的缓存控制,则可以轻松定义其对应项:

@CacheEvict(value = "employee", key = "#surname")public void resetOnSurname(String surname) {// Intentionally blank}

这是使用了已应用于同一规划环境地政司表达一个简单的空白标记方法@Cacheable驱逐所有的Person ,从其中关键的“姓”的说法相匹配的缓存实例。

@Testpublic void testCacheResetOnSurname() {Person employee1 = instance.findEmployeeBySurname("John", "Smith", 22);instance.resetOnSurname("Smith");Person employee2 = instance.findEmployeeBySurname("John", "Smith", 22);assertNotSame(employee1, employee2);}

在上面的代码中,对findEmployeeBySurname(...)的首次调用创建了一个Person对象,Spring将其定义为“ Smith”的键存储在“员工”缓存中。 对resetOnSurname(...)的调用会清除“员工”缓存中所有姓为“ Smith”的条目,最后第二次对findEmployeeBySurname(...)调用将创建一个新的Person对象,Spring再次将其存储在“员工”缓存,并带有“史密斯”键。 因此,变量employee1employee2没有引用相同的对象。

涵盖了Spring的缓存注释之后,下一个难题是研究设置实用的缓存:您如何启用Spring缓存以及应使用哪种缓存实现? 稍后再说……

祝您编程愉快,别忘了分享!

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


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

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

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

相关文章

centos 获取硬件序列号_如何在 Linux 上查找硬件规格

在 Linux 系统上有许多工具可用于查找硬件规格。-- Sk(作者)在 Linux 系统上有许多工具可用于查找硬件规格。在这里,我列出了四种最常用的工具,可以获取 Linux 系统的几乎所有硬件(和软件)细节。好在是这些…

位置服务器管理器,查看 DIMM 位置

键入:-> show /System/Memory/DIMMs -t locationTarget | Property | Value-----------------------------------------------------------------------/System/Memory/DIMMs/ | location | CMIOU0/CM/CMP/BOB00/CH0/DIMM (CPU MemoryDIMM_0 | | IO Unit 0 Memor…

Spring –持久层–编写实体并配置Hibernate

欢迎来到本教程的第二部分。 当您看到本文有多长时间时,请不要惊慌–我向您保证,这主要是简单的POJO和一些生成的代码。 在开始之前,我们需要更新我们的Maven依赖项,因为我们现在将使用Hibernate和Spring。 将以下依赖项添加到pom…

无线服务器主机名是,wifi默认服务器主机名

wifi默认服务器主机名 内容精选换一换以CentOS 7操作系统的弹性云服务器为例:登录Linux弹性云服务器,查看“cloud-init”的配置文件。检查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注释或者删除。如果没有被注释或者删除,则需…

pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...

2020年11月23日,周一,24小时安全值班。利用当班中午的时间,微主在创客空间测试了自闪烁发光二极管在匀加速运动中的效果,结果还比较满意。将小车放置在倾斜的轨道上,将自闪烁发光二极管和纽扣电池构成频闪光源&#xf…

python网络爬虫与信息提取 学习笔记day3

Day3: 只需两行代码解析html或xml信息 具体代码实现:day3_1 注意BeautifulSoup的B和S需要大写,因为python大小写敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

番石榴文件:Java文件管理

正如我在这里 , 这里 , 这里和这里所讨论的那样, Groovy和Java SE 7都为Java文件管理提供了改进。 但是,当特定的Java应用程序尚不能使用Java SE 7或Groovy进行文件管理时,仍然可以通过使用Guava的Files类获得改进的文…

顺序查找

顺序查找属于查找中较容易的一个方法,且对数据是否已经排序没有要求,是很常用的一个查找算法。 但缺点是必须一个一个数字进行比较查找,查找所需步骤可能较多。 顺序查找算法的思想是,将目标与待查找数据进行比较,若发…

王者荣耀微信哪个服务器人最少,王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实...

原标题:王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实大家好!王者荣耀S16赛季已经开启一月之余&#xff…

一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘

什么是新拟态新拟态的英文名称是“Neumorphism”,也有人称为“Soft UI”。简单讲,新拟态是一种图形样式,其原理是通过模拟真实物体来为界面的UI元素赋予真实感。新拟态风格起源于dribbble,后面陆续被收录在2020设计趋势预测里面&a…

JBoss BRMS与JasperReports进行报告

介绍 Jasperreports是一个免费的可下载库,可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3(从客户门户网站http://access.redhat.com ) JasperReports 4.6…

java字符串 删除指定字符的那些事

需求如下: 1.算出2周以前的时间,以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回结果,比如:2017-08-15 就需要显示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…

Hibernate中Hql查询

这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利。 在这里通过定义了三个类,Special、Classroom、Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属…

Java代码质量工具–概述

最近,我有机会在本地IT社区聚会上介绍了该主题。 这是基本演示: Java代码质量工具 以及更有意义的思维导图: 但是,我认为我需要更深入地探讨这一主题。 这篇博客文章应该像是在此方向上进行进一步调查的起点。 1. CodePro Anal…

利用yum升级Centos6的gcc版本,使其支持C++11

下面的可以在centos6下工作,centos7下有问题。可能是因为centos下的scl我是拷贝的文件,没有完全验证centos6下肯定没问题。 https://my.oschina.net/u/583362/blog/682123 和https://www.quyu.net/info/876.html 拷贝其关键内容就是: 1.使用 …

cuda版本查看_ubuntu安装CUDA

0 写在前面安装环境:ubuntu18.04以及GTX1050Ti笔记本为什么要安装CUDA? 参考百科,CUDA是英伟达推出的集成技术,通过该技术可利用GeForce 8 以后的GPU或者较新的Quadro GPU进行计算。例如典型的tensorflow-GPU和pyCUDA安装之前都要…

HTML 标签列表(功能排序) HTML 参考手册- (HTML5 标准)

HTML 标签列表&#xff08;功能排序&#xff09; HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签描述基础 <!DOCTYPE> 定义文档类型。<html>定义一个 HTML 文档<title>为文档定义一个标题<body>定义文档的主体<h1> to <h6>…

idea新建scala文件_IDEA maven项目中新建.scala文件

本文首发于我的博客[IDEA maven项目中新建.scala文件]分为三步第一步、IDEA中安装scala插件1、搜索安装File-Sittings-Plugins-搜索安装scala2、安装完成重启安装完成之后点击重启idea第二步、下载、安装、配置Scala1、下载安装Scala SDK本体搜索引擎搜索Scala SDK或者点我去Sc…

Linux中执行shell脚本的4种方法总结

文章来源&#xff1a;http://www.jb51.net/article/53924.htm 这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下 bash shell 脚本的方法有多种&#xff0c;现在作个小结。假设我们编写好的shell脚本的文件名为hel…

Log4j线程死锁–案例研究

此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案。 它还将说明在开发和支持Java EE应用程序时适当的Java类加载器知识的重要性。 本文也是您提高线程转储分析技能和了解线程竞争条件的另一个机会。 环境规格 Java …