即将发布的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

Spring 3.1缓存抽象教程相关推荐

  1. Spring启动和缓存抽象

    缓存是大多数应用程序的主要组成部分,只要我们设法避免磁盘访问,缓存就会保持强劲. Spring对各种配置的缓存提供了强大的支持 . 您可以根据需要简单地开始,然后进行更多可定制的操作. 这将是spri ...

  2. Spring 之 @Cacheable 缓存使用教程

    1.@Cacheable 指定使用缓存 定义个 Controller ,在方法上加上注解 @Cacheable,配置要使用哪些缓存,比如 myMapCache 表示一级缓存是 Map,myRedisC ...

  3. 简单的Spring Memcached – Spring缓存抽象和Memcached

    在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一. Spring 3.1发行版提供了一个很酷的新功能,称为Cache Abstraction . Spring Cache Abst ...

  4. Spring Boot 2.x基础教程:使用集中式缓存Redis

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 之前我们介绍了两种进程内缓存的用法,包括Spring B ...

  5. Spring Boot 2.x基础教程:使用EhCache缓存集群

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 上一篇我们介绍了在Spring Boot中整合EhCac ...

  6. Spring指南之使用Spring缓存数据(Spring Framework官方文档之缓存抽象详解)

    1.请参见官方文档Spring指南之使用 Spring 缓存数据 2.请参见Spring官方文档之缓存抽象 3.参见github代码 文章目录 一.简介 二.你将创造什么(What You Will ...

  7. (转)使用 Spring缓存抽象 支持 EhCache 和 Redis 混合部署

    背景:最近项目组在开发本地缓存,其中用到了redis和ehcache,但是在使用注解过程中发现两者会出现冲突,这里给出解决两者冲突的具体方案. spring-ehcache.xml配置: <?x ...

  8. Spring Boot 2.x基础教程:使用Redis的发布订阅功能

    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...

  9. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

最新文章

  1. 深入理解ceph-disk activate 源码逻辑
  2. 右键用 pycharm打开
  3. vue使用echarts可视化图形插件
  4. Linux 系统安全加固
  5. [2016-07-15]结合命令行工具awk和多行文本编辑器快速生成DataSeed代码
  6. dotnet 使用 Infer# 自动分析代码缺陷
  7. 特征图注意力_从数据结构到算法:图网络方法初探
  8. 多数据源处理-苞米豆-dynamic
  9. [转]magento2项目上线注意事项 切换到产品模式
  10. hadoop-0.20.2完全分布式集群
  11. 开放API 与 查询语言GraphQL
  12. BUUCTF刷题-RAR 压缩包暴力破解密码
  13. mastercam9.1按alt键卡机,mastercam输入参数卡机需要win10输入法兼容性设置
  14. 18.9.23 PION模拟赛
  15. 【LocalDate】获取两个日期间相差的年数、月数、天数
  16. HTML+CSS学习笔记(pink老师前端课程笔记--补档)
  17. 9月第1周全球域名商TOP15大战:中国万网排名第7
  18. CSS 过渡(重点)
  19. 《程序员修炼之道》笔记(二)
  20. dna c语言,DNA (C语言代码)

热门文章

  1. java –cp ./:_成为Java流专家–第2部分:中级操作
  2. cassandra使用心得_避免在Cassandra中使用清单
  3. 弱投影模型_通过投影增强数据模型
  4. java包装项目_项目包装组织
  5. async 打包异常_重新打包流中的异常
  6. 垃圾收集算法,垃圾收集器_确定活动的热点垃圾收集器
  7. 供给测结构性改革内容_智能包装结构,提高可测性
  8. 投行数据_投行对Java的二十大核心访谈问答
  9. gradle创建web工程_Gradle入门:创建Web应用程序项目
  10. gradle引入依赖:_Gradle善良:获得更多的依赖性见解