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.pswp.cn/news/371380.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371380.shtml
英文地址,請注明出處:http://en.pswp.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 …