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