1.启用spring缓存
spring配置文件专门为缓存提供了一个cache:命名空间,为了启动spring缓存,需要在配置文件中导入cache:命名空间。
- 在spring配置文件中添加
<cache:annotation-driven cache-manager="缓存管理器ID">
,该元素指定spring根据注解来启用Bean级别或方法级别的缓存。默认值是cacheManager - 针对不同的缓存实现配置对应的缓存管理器。
(1)spring内置缓存实现的配置
spring内置的缓存实现只是一种内存中的缓存,并非真正的缓存实现,因此通常只能用于简单的测试环境,不建议在实际项目中使用spring内置的缓存实现。
spring内置的缓存实现使用SimpleCacheManager作为缓存管理器,底层直接使用了JDK的ConcurrentMap来实现缓存,SimpleCacheManager使用了ConcurrentMapCacheFactoryBean作为缓存区,每个ConcurrentMapCacheFactoryBean配置一个缓存区。
<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="users">
</set>
</property>
</bean>
(2)EhCache缓存实现的配置
在配置EhCache缓存实现之前,首先需要将EhCache缓存的JAR包添加到项目的类加载路径下。
需要在类路径下加载ehcahce.xml配置文件:
<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>
缓存区的名字很重要,后面使用注解驱动缓存时需要根据缓存区的名字来将缓存数据放入指定缓存区内。
spring使用EhCacheCacheManager作为Encache缓存实现的缓存管理器,因此只要该对象配置在spring容器中,它就可作为缓存管理器使用,但EnCacheCacheManager底层需要依赖有个net.sf.encache.CacheManager作为实际的缓存管理器。
为了将net.sf.encache.CacheManager纳入spring容器的管理之下,spring提供了EhCacheManagerFactoryBean工厂Bean,该工厂Bean实现了Factory<CacheManager>
接口。
<bean id="ehCacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"
p:shared="false"
/>
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehCacheManager"
/>
2.使用@Cacheable执行缓存
@Cacheable可用于修饰类或修饰方法,当修饰类时,用于告诉spring在类级别上进行缓存—程序调用该类的实例的任何方法时都需要缓存,而且共享同一个缓存区;当修饰方法时,用于告诉spring在方法级别上进行缓存—只有当程序调用该方法时才需要缓存。
属性如下:
- value:必须属性。用于指定该方法用于清除哪个缓存区的数据。
- key:通过SpEL表达式显示指定缓存的key。
- condition:该属性指定一个SpEL表达式,只有当表达式为true时才清除缓存。
- unless:该属性指定一个返回boolean值的SpEL表达式,当该表达式返回true时,spring就不缓存方法返回值。
(1)类级别缓存
当程序调用该类的任意方法时,只要传入的参数相同,spring就会使用缓存。
此处所指的缓存的意义是:当程序第一次调用该类的实例的某个方法时,spring缓存机制会将该方法返回的数据放入指定缓存区,以后程序调用类的实例的任何方法时,只要传入的参数相同,spring将不会真正执行该方法,而是直接利用缓存区中的数据。
@Service("userService")
@Cacheable(value="users",key="#name")
public class UserServiceImpl implements UserService{
}
上面代码显示指定以name参数作为缓存的key,这样只要调用的方法具有相同的name参数,spring缓存机制就是生效。
@CachePut与@Cacheable区别是修饰的方法不会读取缓存区中的数据,不管缓存区是否已有数据,都要重新执行这些方法,并再次将方法的返回值放入缓存区中。
(2)方法级别缓存
当程序调用该方法时,只要传入的参数相同,spring就会使用缓存。
当两个方法使用了不同的缓存区之后,它们不能共享缓存数据。
(3)使用@CacheEvict清除缓存
被@CacheEvict注解修饰的方法可用于清除缓存。可指定如下属性:
- value:必须属性。用于指定该方法用于清除哪个缓存区的数据。
- allEntries:该属性指定是否清空整个缓存区。
- beforeInvocation:该属性指定是否在执行方法之前清除缓存。默认是在方法成功之后才清除缓存。
- condition:该属性指定一个SpEL表达式,只有当表达式为true时才清除缓存。
- key:通过SpEL表达式显示指定缓存的key。