缓存(Caching)可以存储经常会用到的信息,这样每次需要的时候,这些信息都是立即可用的。尽管Spring自身并没有实现缓存的解决方案,但是它对缓存功能提供了声明式的支持,能够与多种流行的缓存实现进行集成。
启用对缓存的支持
Spring对缓存的支持有两种方式:
1)注解驱动的缓存
2)XML声明的缓存
使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。
通过使用@EnableCaching启用注解驱动的缓存
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching // 启用缓存
public class CacheConfig {
/**
* 声明缓存管理器
* @return
*/
@Bean
public CacheManager cacheManager(){
return new ConcurrentMapCacheManager();
}
}
缓存管理器(CacheManager),是Spring缓存抽象的核心,它能够与多个流行的缓存实现进行集成。
ConcurrentMapCacheManager,使用java.util.concurrent.ConcurrentHashMap作为其缓存存储,但它的缓存存储是基于内存的,它的生命周期是与应用关联。
配置缓存管理器
Spring 3.1内置了五个缓存管理器实现,如下所示:
- SimpleCacheManager
- NoOpCacheManager
- ConcurrentMapCacheManager
- CompositeCacheManager
- EhCacheCacheManager
Spring 3.2引入了另外一个缓存管理器,这个管理器可以用在基于JCache(JSR-107)的缓存提供商之中。
Spring Data又提供了两个缓存管理器:
RedisCacheManager(来自于Spring Data Redis项目)
GemFireCacheManager(来自于Spring Data GemFire项目)
使用EhCacheCacheManager
使用Java配置的方式设置EhCacheCacheManager
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import net.sf.ehcache.CacheManager;
@Configuration
@EnableCaching
public class CachingConfig {
/**
* 配置EhCacheCacheManager
* @param cm
* @return
*/
@Bean
public EhCacheCacheManager chacheManager(CacheManager cm){
return new EhCacheCacheManager(cm);
}
/**
* 配置 EhCacheManagerFactoryBean
* @return
*/
@Bean
public EhCacheManagerFactoryBean ehcache(){
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
return ehCacheManagerFactoryBean;
}
}