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.mzph.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 操…