我最近在博客中谈论有关Spring 3.1及其新的缓存注释@Cacheable和@CacheEvict 。 与所有Spring功能一样,您需要进行一定数量的设置,并且通常使用Spring的XML配置文件来完成。 在缓存的情况下,打开@Cacheable@CacheEvict并不容易,因为您要做的就是将以下内容添加到Spring配置文件中:

<cache:annotation-driven />

…以及您的beans XML元素声明中的适当模式定义:

<beans xmlns='http://www.springframework.org/schema/beans' xmlns:p='http://www.springframework.org/schema/p'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:cache='http://www.springframework.org/schema/cache' xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/cachehttp://www.springframework.org/schema/cache/spring-cache.xsd'>

…的主要特点是:

xmlns:cache='http://www.springframework.org/schema/cache'

…和:

http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd

但是,这还不是故事的结局,因为您还需要指定一个缓存管理器和一个缓存实现。 好消息是,如果您熟悉其他Spring组件(例如数据库事务管理器)的设置,那么这样做的方式就不足为奇了。

缓存管理器类似乎是实现Spring的org.springframework.cache.CacheManager接口的任何类。 它负责管理一个或多个缓存实施,其中缓存实施实例负责实际缓存数据。

下面的XML示例摘自我最近两个博客中使用的示例代码。

<bean id='cacheManager' class='org.springframework.cache.support.SimpleCacheManager'><property name='caches'><set><beanclass='org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean'p:name='employee'/><!-- TODO Add other cache instances in here--></set></property>
</bean>

在上面的配置中,我使用Spring的SimpleCacheManager来管理其ConcurrentMapCacheFactoryBean实例,该实例的缓存实现名为:“ employee ”。

需要注意的重要一点是,您的缓存管理器必须具有cacheManager 。 如果您弄错了,那么将得到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.interceptor.CacheInterceptor#0': Cannot resolve reference to bean 'cacheManager' while setting bean property 'cacheManager'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cacheManager' is definedat org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:328)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
populateBean(AbstractAutowireCapableBeanFactory.java:1118)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.
doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
:
:  trace details removed for clarity
:at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.
runTests(RemoteTestRunner.java:683)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.
run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.
main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No bean named 'cacheManager' is definedat org.springframework.beans.factory.support.DefaultListableBeanFactory.
getBeanDefinition(DefaultListableBeanFactory.java:553)at org.springframework.beans.factory.support.AbstractBeanFactory.
getMergedLocalBeanDefinition(AbstractBeanFactory.java:1095)at org.springframework.beans.factory.support.AbstractBeanFactory.
doGetBean(AbstractBeanFactory.java:277)at org.springframework.beans.factory.support.AbstractBeanFactory.
getBean(AbstractBeanFactory.java:193)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.
resolveReference(BeanDefinitionValueResolver.java:322)

就像我在上面说的那样,在我的简单配置中,整个工作由SimpleCacheManager协调。 根据文档,这通常是“用于测试或简单的缓存声明”。 尽管您可以编写自己的CacheManager实现,但Spring的专家们为不同情况提供了其他缓存管理器

  • SimpleCacheManager –参见上文。
  • NoOpCacheManager –用于测试,因为它实际上并不缓存任何内容,尽管在这里要小心,因为在不进行缓存的情况下测试代码可能会在打开缓存时使您绊倒。
  • CompositeCacheManager –允许在单个应用程序中使用多个缓存管理器。
  • EhCacheCacheManager –包装ehCache实例的缓存管理器。 见http://ehcache.org

对于Spring Profile选择在任何给定环境中使用哪个缓存管理器似乎是一个很好的用途。 看到:?

  • 在XML Config中使用Spring配置文件
  • 使用Spring Profiles和Java配置

而且,尽管只是为了完整起见,但这只是将内容整理一下,下面是我前两个博客中使用的完整配置文件:

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans' xmlns:p='http://www.springframework.org/schema/p'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:cache='http://www.springframework.org/schema/cache' xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd'><!-- Switch on the Caching --><cache:annotation-driven /><!-- Do the component scan path --><context:component-scan base-package='caching' /><!-- simple cache manager --><bean id='cacheManager' class='org.springframework.cache.support.SimpleCacheManager'><property name='caches'><set><bean class='org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean' p:name='employee'/><!-- TODO Add other cache instances in here--></set></property></bean></beans>

正如哥伦波中尉喜欢说:“还有一件事,你知道让我为这个案件烦恼……”; 好吧,关于缓存管理器,有几件事让我感到困扰,例如:

  • 在谈论SimpleCacheManager时,Spring的家伙们所说的“对测试或简单的缓存声明有用”是什么意思? 您究竟应该何时愤怒地使用它而不是进行测试?
  • 最好编写自己的CacheManager实现,甚至是Cache实现吗?
  • 使用EhCacheCacheManager确切优势是什么?
  • 您真正需要多少时间CompositeCacheManager

我将来可能会研究所有这些……

祝您编程愉快,别忘了分享!

参考:来自Captain Debug's Blog博客的JCG合作伙伴 Roger Hughes的Spring 3.1 Caching and Config 。

翻译自: https://www.javacodegeeks.com/2012/09/spring-31-caching-and-config.html

Spring 3.1缓存和配置相关推荐

  1. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  2. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  3. 基于Spring的Web缓存

    缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...

  4. 实战SSM_O2O商铺_45【Redis缓存】配置Redis在Service层加入缓存

    文章目录 概述 Windows下安装Redis O2O-Service层加入缓存的配置步骤 1. pom.xml 添加jedis依赖包 2. redis配置文件 3.spring-dao.xml加载r ...

  5. Java Spring Data Redis实战与配置参数详解 application.properties...

    Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...

  6. Spring 3.1缓存和@Cacheable

    缓存在软件领域已经存在很长时间了. 它们是那些真正有用的东西之一,一旦您开始使用它们,您会想知道如果没有它们,您是如何相处的,所以似乎让Spring的家伙们只是在版本中向Spring核心添加缓存实现有 ...

  7. Spring Cloud Config服务端配置细节(一)

    上篇文章我们看了Spring Cloud中分布式配置中心的一个基本使用,这里边还涉及到许多细节,本文我们就来看看服务端配置中的一些细节. 本文是Spring Cloud系列的第二十三篇文章,了解前二十 ...

  8. Spring Boot————默认缓存应用及原理

    引言 应用程序的数据除了可以放在配置文件中.数据库中以外,还会有相当一部分存储在计算机的内存中,这部分数据访问速度要快于数据库的访问,因此通常在做提升数据访问速度时,会将需要提升访问速度的数据放入到内 ...

  9. Spring Boot Redis缓存

    Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...

最新文章

  1. Ubuntu 系统 启动报错 /: UNEXPECTED INCONSISTENCY; RUN FSCK MANUALLY
  2. 删除电脑里的空文件夹
  3. 解决用户使用临时配置文件登陆WIN7的问题
  4. 带卷积核的神经网络的迭代次数与收敛标准的关系
  5. 三种会计科目表:运营会计科目表、国家会计科目表、集团会计科目表
  6. C++中的抽象类以及接口的区别联系
  7. oracle坏块修复
  8. MVC+LINQToSQL的Repository模式之(二)数据基类
  9. PAT (Basic Level) Practise (中文)- 1002. 写出这个数 (20)
  10. 580显卡驱动_越贵的显卡越好吗?顶级AMD RX580功耗超过200W,RMB只买了外观?
  11. python的函数的笔记_Python笔记-函数1
  12. 迅雷Bolt界面引擎将于3月19日对外开放
  13. System center 2012 R2 实战九、SCOM+sharpoint+visio实现全国地图展示
  14. 关于javaweb中的流媒体
  15. Java课程设计之你画我猜
  16. vue手写签名,canvas手写签名,canvas签名图片旋转
  17. 屌丝码农该怎么过周末
  18. 网页、网站和HTML
  19. 深度学习的不确定性(Uncertainty/confidence score)与校准(Calibration)
  20. Java 访问MySQL的小例子

热门文章

  1. spring boot 入门荔枝
  2. pojo 带参构造函数_带有Java Pojo作为输入输出示例的AWS Lambda函数
  3. junit 5测试异常处理_使用JUnit 5测试异常
  4. jgroups_JGroups:无需额外基础架构的领导人选举
  5. 视图中::text_新CalendarFX视图:MonthGridView!
  6. 设计模式示例_复合设计模式示例
  7. java.lang.Record:规范草案
  8. 使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥
  9. Kubernetes集群上的Apache Ignite和Spring第2部分:Kubernetes部署
  10. Java 14的新功能