Spring笔记——14.Spring3新增加的缓存机制

Spring3.1新增了一种缓存机制,这种缓存机制与Spring容器无缝结合在一起,可以对容器中的任意bean或bean的方法增加缓存。Spring的缓存级别更高,可以在控制器组件或业务逻辑组件级别进行缓存,这样应用完全无需重复调用底层的DAO。


启动Spring缓存

xml中有一个cache命名空间专门用来配置缓存。启动缓存需要在xml中添加如下一行:

<cache:annotation-driven chache-manager="缓存管理器ID"/>

该元素指定Spring根据注解来启动bean级别或方法级别的缓存。此外还需要准对不同的缓存实现配置对应的缓存管理器。


EhCache缓存实现的配置

我们需要将Hibernate\lib\optiona\ehcache下的ehcache-core与slf4j-api两个jar包添加到项目中。前面是缓存核心包,后面是缓存工具的日志工具。为了使用ChCache,我们需要在应用的类加载路径下添加一个ehcache.xml文件:

<?xml version="1.0" encoding="gbk"?>
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        maxElementsOnDisk="10000000"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU"/>
    <cache name="users"
        maxElementsInMemory="10000"
        eternal="false"
        overflowToDisk="true"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"/>
</ehcache>

上面的文件配置了两个缓存区,一个是默认的,一个是users。由于这里使用EhCacheCacheManager作为缓存管理器,因此我们需要将这个对象配置在Spring容器中。但是EhCaheCacheManager底层需要一个net.sf.ehcache.CacheManager作为实际的缓存管理器。因此Spring提供了EhCacheManagerFactory

Bean这个工厂Bean,它实现了FactoryBean<CacheManager>接口。当把EhcacheManagerFactoryBean部署在容器中,实际上取用的是它的产品,也就是CacheManager对象。为了在容器中配置基于EhCache的缓存管理器,只要添加如下两段代码即可:

<bean id="ehCacheManager"
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
    p:configLocation="classpath:ehcache.xml"
    p:shared="false"/>
<bean id="cacheManager"
    class="prg.springframework.cache.ehcache.EhCacheCacheManager"
    p:cacheManager=ref="ehCacheManager"/>

首先我们配置了一个叫ehCacheManager的工厂类,它能够返回CacheManger对象。第二个才是为Spring缓存配置的基于EhCache的缓存管理器,它依赖于CacheManager,因此给它注入一个实例变量,也就是第一个工厂bean的索引。上述配置完成,我们就可以使用注解来驱动Spring将缓存数据存入指定缓存区了。


使用@Cacheable执行缓存

可以用@Cacheable来修饰类或者方法,以通知Spring框架在什么级别上使用缓存。如果是类级别,程序调用实例的任何方法都需要缓存。

类级别的缓存

如果类标注了缓存,那么对于其中任意方法,只要传入的参数相同,就回去调用缓存。通过调用缓存得到的两个实例,是相等的,同一个实例。

@Cacheable(value="users")
public class UserServiceimpl implements UserService{
}

如果再增加一个key=”#name"属性,那么只要参数的name一样,就直接调用缓存,虽然其他参数并不一样,但是不管了!!!!!!!仍然是同一个对象实例。

condition属性可以指定只要condition表达式为true才会执行缓存,比如condition="#age<100",这样其他参数就会忽略了,只要age这一个小于100,那么就从缓存中调取,不再执行方法了。而unless则与此正好想反,只要unless后边的表达式为true,就不执行缓存。

方法级别的缓存

对方法进行标注,只要传入相同参数就从缓存掉。也支持上述其它属性

使用@CacheEvict清除缓存

被@CacheEvict标注的方法可以用来清除缓存。value属性用于指定清除哪个缓存区属性,allEntries指定是否清除整个缓存区。beforeInvocation指定是否在方法前清除缓存。默认的是在方法后的。condition指定一个SpEL表达式,只有当true才清除。key可以通过SpEL表达式显式地指定缓存的key。

时间: 2024-10-29 19:05:48

Spring笔记——14.Spring3新增加的缓存机制的相关文章

手把手教你构建 Android WebView 的缓存机制 &amp; 资源预加载方案

前言 由于H5具备 开发周期短.灵活性好 的特点,所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题,特别突出的是:加载速度慢 & 消耗流量 今天,我将针对 Android Webview 的性能问题,提出一些有效解决方案. 目录 1. Android WebView 存在什么性能问题? Android WebView 里 H5 页面加载速度慢 耗费流量 下面会详细介绍. 1.

mybatis学习笔记(14)-spring和mybatis整合

mybatis学习笔记(14)-spring和mybatis整合 mybatis学习笔记14-spring和mybatis整合 整合思路 整合环境 sqlSessionFactory 原始dao开发和spring整合后 mapper代理开发 遇到的问题 本文主要将如何将spring和mybatis整合,只是作简单的示例,没有使用Maven构建.并展示mybatis与spring整合后如何进行原始dao开发和mapper代理开发. 整合思路 需要spring通过单例方式管理SqlSessionFa

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa

C++ 学习笔记(一些新特性总结 1)

C++ 学习笔记(一些新特性总结 1) 虽然我也用了 C++ 有挺多年了,但是一直本着够用就行的原则,没有特别深入的学习过C++ 的语法,所以好多高级的 C++ 特性都不了解.正好最近从网上找到了本书<C++ 14 Quick Syntax Reference>,挺薄的一本书,只有 100多页,但是覆盖了基本所有 C++ 的特性.这个小短文就是我看这本书时摘抄下来的一些我以前没有注意到的知识点. 文中所有代码都在 gcc version 5.3.0 (Rev1, Built by MSYS2

机器学习基石笔记14——机器可以怎样学得更好(2)

转载请注明出处:http://www.cnblogs.com/ymingjingr/p/4271742.html 目录 机器学习基石笔记1——在何时可以使用机器学习(1) 机器学习基石笔记2——在何时可以使用机器学习(2) 机器学习基石笔记3——在何时可以使用机器学习(3)(修改版) 机器学习基石笔记4——在何时可以使用机器学习(4) 机器学习基石笔记5——为什么机器可以学习(1) 机器学习基石笔记6——为什么机器可以学习(2) 机器学习基石笔记7——为什么机器可以学习(3) 机器学习基石笔记8

C++ 学习笔记(一些新特性总结3)

C++ 学习笔记(一些新特性总结3) public.protected 和 private 继承 public 继承时,基类的存取限制是不变的. class MyClass { public: // Unrestricted access int myPublic; protected: // Defining or derived class only int myProtected; private: // Defining class only int myPrivate; } class

Swift学习笔记(14)--方法

1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方法的func关键字之前加上关键字class:声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static. 方法的参数名参见学习笔记的函数章节 2.在实例方法中修改值类型和self 结构体和枚举是值类型.一般情况下,值类型的属性不能在它的实例方法中被修改. 但是,如果你确实需要在某个

【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计

[转] C#学习笔记14--Trace.Debug和TraceSource的使用以及日志设计 Trace.Debug和TraceSource的使用以及日志设计   .NET Framework 命名空间 System.Diagnostics 包含用于跟踪执行流程的 Trace.Debug 和 TraceSource 类,以及用于分析代码的 Process.EventLog 和 PerformanceCounter 类. 跟踪是一种在应用程序运行时监视其执行情况的方式.当开发 .NET Frame

api-gateway实践(14)新服务网关 - 业务场景验证(五)api-gateway-engine携带有效token访问SvcApp (未完!!!!!!!!!!)

api-gateway实践(14)新服务网关 - 业务场景验证(五)api-gateway-engine携带有效token访问SvcApp (未完!!!!!!!!!!) 环境信息 1.Security-Filter拦截(web.xml) 2.Zuul-Filter拦截(web.xml) 3.zuul servlet(web.xml) 4.spring的DispatcherServlet(web.xml) 准备工作 1.api-gateway-engine2向SvcApp申请access_toke