首页 > 代码库 > Spring Cache
Spring Cache
上一节,了解了Hibernate的Cache,这里来了解一下Spring对Cache的支持。
Spring的Cache用于Java方法,减少方法的执行。在每一次一个target方法调用时,Spring就会根据方法、参数值来检查是否这个方法被执行过。如果之前执行过,就直接取得上次执行的结果。如果没有则执行,并缓存结果。
Spring Cache只是一个抽象,没有相应的实现。它的实现使用了两种存储策略。1、JDK的java.util.concurrent.ConcurrentMap;2、Ehcache
对于Spring 3.1 以上版本(包括Spring 3.1)
Spring cache Abastract相关注解
一般使用三个注解:@Cacheable 、@CacheEvict
@Cacheable 指定某个方法使用并读写缓存。
@CacheEvict指定某个方法使用并从缓存中移除数据。
@CachePut 指定某个方法使用并只写缓存。
上面三种注解配置方法时,一个方法只能使用三者之一。如果要使用多个,则需要使用@Caching 。
Spring 使用Cache,需要在applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <cache:annotation-driven /></beans>
Spring Cache的两种存储策略
之前已经说了,Spring Cache并没有提供的具体实现,需要另外两种存储策略的支持。
下面就说说着两种存储策略。
1、ConcurrentMap
使用ConcurrentMap作为存储策略时,只需要指定一个SimpleCacheManager作为CacheManager的实例,并配置N个命名的ConcurrentMapCacheFactoryBean作为缓存。例如:
<!-- generic cache manager --><bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/> <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="books"/> </set> </property></bean>
上面的p:name就是缓存区间的名字,例如p:name="books",就是在注解@Cacheable(value="http://www.mamicode.com/books")使用。
2、Ehcache
如果是使用Ehcache作为Spring Cache的具体存储策略,那么做如下的配置即可。
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/> <!-- EhCache library setup --><bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>
ehcache.xml是Ehcache配置Cache的。
Spring 2.5-Spring3.1 版本使用Cache
在Spring 3.1以前的版本中没有上面说的注解。如何让Spring使用cache呢?
Ehcache提供了对Spring的早期版本的支持。
在pom.xml中添加依赖如下:
<dependency> <groupId>com.googlecode.ehcache-spring-annotations</groupId> <artifactId>ehcache-spring-annotations</artifactId> <version>1.2.0</version></dependency>
这个jar包中有两个注解@Cacheable、@TriggersRemove
@Cacheabele:指定方法是使用缓存。
@TriggersRemove:从缓存中移除对象。
在applicationContext.xml中添加Ehcache的支持:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd"> <ehcache:annotation-driven /> <ehcache:config cache-manager="cacheManager"> <ehcache:evict-expired-elements interval="60" /> </ehcache:config> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="/WEB-INF/ehcache.xml"/></bean> <!-- rest of the file omitted --> </beans>
上面的配置中,也同样指定了ehcache文件的位置。
网上也有相关的例子:
http://blog.goyello.com/2010/07/29/quick-start-with-ehcache-annotations-for-spring/
Spring Cache