Spring3.1 已加缓存的实现,今天主要介绍一下Spring Cache的基本使用,要想使你的程序具体缓存的功能,首先需要在配置文件中增加以下配置:
1、如果使用Annotation 方式配置缓存,需要有以下配置:
<cache:annotation-driven />
默认的缓存管理器的名字为cacheManager,如果需要指定缓存管理器名称,需要指定其名称
如:
<cache:annotation-driven cache-manager="cacheManager"/>
设置好注解配置过后,需要设置缓存管理器。
<!-- 缓存管理器声明--> <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="base"/> </set> </property> </bean>
当前配置的是用ConcurrentMap作为缓存容器,当然,也可以自定义缓存容器,具体参见srping 文档,上述配置指定的两个缓存管理器,分别为:default,base。
完整配置如下:
1: <beans xmlns="http://www.springframework.org/schema/beans"
2: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3: xmlns:cache="http://www.springframework.org/schema/cache"
4: xmlns:p="http://www.springframework.org/schema/p"
5: xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
6: http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
7:
8:
9: <cache:annotation-driven cache-manager="cacheManager"/>
10:
11:
12: <!-- 缓存管理器声明-->
13: <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
14: <property name="caches">
15: <set>
16: <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="default"/>
17: <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="base"/>
18: </set>
19: </property>
20: </bean>
21:
22: </beans>
2、XML配置好过后,如何在程序中使用,请看下面介绍
如果需要缓存某个业务的字典数据,可直接在方法增加Cacheable标
@Cacheable(value = "base", key = "#root.methodName") public List<String> getCredits() { logger.info("开始查询证件类型"); List<String> credits = new ArrayList<String>(); credits.add("身份证"); credits.add("军官证"); credits.add("学生证"); return credits; }
在该方法上增加@Cacheable注解,Spring会自动把返回的数据加到缓存中,并且把数据缓存在base容器中,同时设定的key的名称为: 方法名。
key的名称定可以采用SPEL表达式。
@Cacheable(value = "base", key = "#type") public List<String> findSeats(String type) { List<String> seats = new ArrayList<String>(); if ("seat".equals(type)) { logger.info("开始查询席位类型"); int base = 97; // 构建Seat记录 for (int i = 0; i < 26; i++) { int tmp = base + i; seats.add(String.valueOf((char) tmp)); } } else if ("ticket".equals(type)) { logger.info("开始查询票种类型"); int base = 65; // 构建Seat记录 for (int i = 0; i < 26; i++) { int tmp = base + i; seats.add(String.valueOf((char) tmp)); } } return seats; }
该示例演示了,缓存的数据以type为key。
3、缓存数据更新
示例:
/** * 当发生席位记录变更,需要清除现有的缓存。 */ @CacheEvict(value = "base", key = "#type") public void updateSeats(String type) { logger.info("开始更新席位记录"); }
在更新的方法中,增加@CacheEvict 注解,并且要指定需要更新的是哪个容器和key,如果没有指定key,那该容器的所有数据都会更新。