Spring 3.1緩存抽象教程

即將發布的Spring 3.1版本中引入的新功能之一是緩存抽象之一 。

Spring Framework提供了對將緩存透明添加到現有Spring應用程序中的支持。 與事務支持類似,緩存抽象允許一致使用各種緩存解決方案,而對代碼的影響最小。

從本質上講,抽象將緩存應用于Java方法,從而基于緩存中可用的信息減少了執行次數。 也就是說,每次調用目標方法時,抽象將應用緩存行為,以檢查該方法是否已針對給定參數執行。 如果有,則返回緩存的結果,而不必執行實際的方法; 如果還沒有,則執行該方法,將結果緩存并返回給用戶,以便下次調用該方法時,返回緩存的結果。

這個概念當然不是什么新鮮事物。 您可以查看Spring,AspectJ,Ehcache方法的緩存Aspect是我們JCG合作伙伴之一Brian Du Preez撰寫的一篇非常有趣的文章,其中使用了Aspect Oriented Programming 。

顧名思義,“緩存抽象”不是實際的實現,因此它需要使用實際的存儲來存儲緩存數據。 您可能已經猜到了,開箱即用地提供了Ehcache支持。 還有一個基于JDK的ConcurrentMap的實現,您實際上可以插入不同的后端緩存 。

現在,讓我們看一些有關緩存抽象的示例代碼。 為此,我將使用JCG的另一位合作伙伴 James Carr 在Spring 3.1.0.M1中提供的非常有用的Cache Abstraction 。 確保在此過程中將Spring Cache包Javadocs標記為書簽。

(注意:對原始帖子進行了少量編輯以提高可讀性)

昨天發布的另一個新功能與我同時嘗試了一些基于注釋的緩存策略。 緩存抽象基本上是從現有項目中獲取約定,并使其成為Spring核心的一部分。

本質上,它引入了一個新接口CacheManager ,可以通過特定的緩存實現來實現。 從那里開始,它添加了一些新的注釋以使方法可緩存。 這是一個使用我以前的posts對象的示例。

package com.jamescarr.example;import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;import javax.annotation.PostConstruct;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;@Repository
public class MemoryMessageRepository implements MessageRepository {private static final Logger LOG =LoggerFactory.getLogger(MemoryMessageRepository.class);private final Map<String, Message> messages = new ConcurrentHashMap<String, Message>();@Cacheable("message")public Message getMessage(String title){LOG.info("Fetching message");return messages.get(title);}@CacheEvict(value="message", key="message.title")public void save(Message message){LOG.info("Saving message");messages.put(message.getTitle(), message);}public Collection<Message> findAll() {return messages.values();}@PostConstructpublic void addSomeDefaultMessages(){save(new Message("Hello", "Hello World"));save(new Message("Appointment", "Remember the milk!"));}}

在這里,您會發現finder方法具有@Cachable批注,其名稱指定了要存儲到的緩存。 它還可以使用其他屬性,例如,使用表達式語言從傳入的參數確定鍵的鍵。默認值為所有方法參數的值。 在保存方法上,我使用@CacheEvict從緩存中刪除已緩存的元素(如果已存在)。

當然,這本身并不會起作用,因此您必須自己啟用它(這很好……您需要做的最后一件事是發現一個生產應用程序,將不需要緩存的內容緩存起來)。 不幸的是,在撰寫本文時,我還沒有發現如何在非xml中執行此操作,因此這是啟用它并使用ehcache作為實現的spring xml文件。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:cache="http://www.springframework.org/schema/cache"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"><cache:annotation-driven /><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/><bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="classpath:com/jamescarr/example/ehcache.xml"/></beans>

ehcache配置:

<ehcache><diskStore path="java.io.tmpdir"/><cache name="message"maxElementsInMemory="100"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"maxElementsOnDisk="10000000"diskPersistent="false"diskExpiryThreadIntervalSeconds="120"memoryStoreEvictionPolicy="LRU"/></ehcache>

最后將其添加到AppConfiguration中,其中包括執行一個簡單的@ImportResource 。

package com.jamescarr.configuration;
import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;import com.jamescarr.example.MessagePrinter;@Configuration
@ComponentScan("com.jamescarr.example")
@ImportResource("classpath:com/jamescarr/example/cache-context.xml")
public class AppConfig {@Autowiredprivate MessagePrinter messagePrinter;@PostConstructpublic void doSomething(){messagePrinter.printMessage("Hello");messagePrinter.printMessage("Hello");}public static void main(String[] args) {new AnnotationConfigApplicationContext(AppConfig.class);}
}

在運行此示例時,第一次單擊該方法時應該有一條日志消息,然后第二次則看不到(因為它是從緩存中拉出的。對于為可能只是為了實現該方法的方法實現備忘錄化而言 ,這絕對是很棒的選擇進行一些CPU密集型計算(但是在一組輸入的情況下給出了確切的預期結果)。我為在該領域進行更多工作而感到興奮……我之前已經做過方法級緩存(這很常見),但是無需DIY就可以使用它。

就是這樣。 一個簡單的指南,可幫助您開始使用James Carr的 Spring的Cache抽象 。 別忘了分享!

相關文章:

  • 使用Spring AOP進行面向方面的編程
  • 帶有Spring和Maven教程的JAX–WS
  • 使用Spring使用Java發送電子郵件– GMail SMTP服務器示例
  • 使用Spring AspectJ和Maven進行面向方面的編程

翻譯自: https://www.javacodegeeks.com/2011/02/spring-31-cache-abstraction-tutorial.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Linux內核分析》 第四節 扒開系統調用的三層皮(上)

黃胤凱 原創作品轉載請注明出處 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 一、視頻學習 1.系統調用的三層皮&#xff1a;xyz system_call sys_xyz 對應的是API&#xff0c;中斷向量對應的中斷服務程序&#xff0c;系統調用服務程…

如何在Java中獲得類似于C的性能

總覽 Java有許多可能很慢的領域。 但是&#xff0c;對于每個問題都有解決方案。 許多解決方案/黑客都需要解決Java的保護問題&#xff0c;但是如果您需要低水平的性能&#xff0c;還是可以的。 Java使高級編程變得更簡單容易&#xff0c;但代價是使低級編程變得更加困難。 幸…

STARTUPINFO結構

1.結構原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring聲明式事務示例

事務是具有ACID &#xff08;原子的&#xff0c;一致的&#xff0c;隔離的和持久的&#xff09;屬性的工作單元。 原子意味著所有更改都發生或什么都沒有發生。 如果從一個帳戶借錢并貸記到另一個帳戶&#xff0c;則交易將確保借記和貸項均已完成或均未完成。 一致表示更改使數…

路徑 (Path)–nodejs

本模塊包含一套用于處理和轉換文件路徑的工具集。幾乎所有的方法只做字符串變換&#xff0c; 不會調用文件系統檢查路徑是否有效。 通過 require(path) 來加載此模塊。以下是本模塊所提供的方法&#xff1a; path.normalize(p) 規范化字符串路徑&#xff0c;注意 .. 和 . 部分 …

OllyDBG反匯編快速找到程序入口一點分析

出處&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先聲明下&#xff1a;這個和脫殼沒關系&#xff0c;不是找殼里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;個別朋友不要誤會哈。其實這個應該是基礎&#xff0c;但我經常找…

簡單的Twitter:Heroku上的Play框架,AJAX,CRUD

因此&#xff0c;重大的公告發布了– Heroku開始為Play Framework應用程序提供本機支持&#xff01; 如果您還沒有聽說過&#xff0c;請在Heroku的博客上查看Jesper Joergensen的帖子 。 因此&#xff0c;對于演示&#xff0c;我將建立一個非常基本的Twitter副本&#xff1b; 它…

Cron表達式

CronTrigger CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日歷的概念&#xff0c;而非SimpleTrigger完全指定的時間間隔&#xff0c;復發的發射工作的時間表。CronTrigger&#xff0c;你可以指定觸發的時間表如“每星期五中午”&#xff0c;或“每個工作日…

深入理解JavaScript學習筆記(3)_全面解析Module模式

簡介 Module模式是JavaScript編程中一個非常通用的模式&#xff0c;一般情況下&#xff0c;大家都知道基本用法&#xff0c;本文嘗試著給大家更多該模式的高級使用方式。 首先我們來看看Module模式的基本特征&#xff1a; 模塊化&#xff0c;可重用封裝了變量和function&#x…

匯編----乘指令: MUL、IMUL

MUL: 無符號乘 ;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX IMUL: 有符號乘 ;影響 OF、CF 標志位;…

Google App Engine Java功能和命名空間API

功能API 使用Capabilities API&#xff0c;您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用&#xff0c;然后繞過它來減少應用程序的停機時間。 我們該如何處理&#xff0c;這是個折衷方案&#xff1f; 1.優雅&#xff1a;創…

破解key file時經常用到的幾個API函數及其用法

CreateFile函數 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP計劃任務之關閉瀏覽器后仍然繼續執行的函數

函數名稱&#xff1a;ignore_user_abort 本函數配置或取得使用端連接中斷后&#xff0c;PHP 程序是否仍繼續執行。默認值為中斷連接后就停止執行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 選項就是配置處。本功能在 PHP 3.0.7 版之后才開始提供。 官方說明…

node--更新數據庫問題

昨天測試blog的comment功能&#xff0c;在新增comment相關的代碼之后&#xff0c;重啟應用&#xff0c;出現Cannot call method forEach of undefined 。反復核對代碼&#xff0c;都沒發現異常&#xff0c;最后將數據庫文件刪除之后&#xff0c;再重啟數據庫&#xff0c;一切正…

U盤做完啟動盤,如何恢復原始容量

&#xff08;1&#xff09;右擊“我的電腦”&#xff0c;選擇“管理”選項&#xff0c;之后選擇“磁盤管理”&#xff0c;查看自己U盤的索引&#xff0c;如&#xff1a;Disk 1&#xff08;2&#xff09;在運行窗口&#xff0c;輸入cmd&#xff0c;回車&#xff0c;出現Dos運行環…

GWT Spring和Hibernate進入數據網格世界

利用Infinispan數據網格的功能最大化Hibernate性能。 一個GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我們將討論如何將Infinispan用作Hibernate二級緩存提供程序。 Infinispan是JBoss緩存的…

記對一個key file crackme的破解

crackme下載地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 遞歸 及 分組匯總 高級部分(多維數據集)

UNION 等集合操作符&#xff1a;UNION 等以第一個 SELECT 的 列明 作為 整個結果集的列明&#xff0c;整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY 這個意思是說 只有 ORDER BY 是對整個結果集作用的&#xff0c;其它都操作都作用在 UINON 兩側的 子集合中。EXCEPT 操…