前言
缓存现已成为了项目的标配,更是面必问的知识点。若你说你的项目中还没有使用到缓存,估计你都不太好意思介绍你的项目。
Spring3.1 之后就引入了基于注解的缓存技术,但是要明白Spring基于注解的缓存技术并不是一个具体的实现方案(EHCache、OSCache、Redis才是具体的缓存方案),而是对缓存使用的一个抽象。 基于注解的缓存能够在现有的代码基础上只需要加入少量的缓存注解(@Cacheable 、@CachePut 、@CacheEvict 、@Caching )即能够达到缓存方法的返回结果的效果。(使用缓存注解实现缓存无需关心缓存具体的实现产品~)
开启缓存注解的步骤
通过前面多篇文章的学习我们发现,启用Spring的一个功能模块是一件非常方便的事。自然作为Spring框架的核心功能之缓存注解,该功能自然也继承了Spring这个优良特性,使它生效只需要轻松两步:
- 配置类上开启缓存注解支持:
@EnableCaching - 向容器内至少放置一个
CacheManager 类型的Bean
仅仅简单的两步后,就可以开工使用Spring强大的缓存注解功能了。
简单示例
按照上面两个步骤配置如下:
@EnableCaching
@Configuration
public class CacheConfig {
@Bean
public ConcurrentMapCacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager();
return cacheManager;
}
}
配置好后,开工书写需要使用缓存的代码,此处以Service为例:
@Service
public class CacheDemoServiceImpl implements CacheDemoService {
@Cacheable(cacheNames = "demoCache", key = "#id")
@Override
public Object getFromDB(Integer id) {
System.out.println("模拟去db查询~~~" + id);
return "hello cache...";
}
}
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class, CacheConfig.class})
public class TestSpringBean {
@Autowired
private CacheDemoService cacheDemoService;
@Autowired
private CacheManager cacheManager;
@Test
public void test1() {
cacheDemoService.getFromDB(1);
cacheDemoService.getFromDB(1);
Cache demoCache = cacheManager.getCache("demoCache");
System.out.println(demoCache.getName());
System.out.println(demoCache.get(1, String.class));
}
}
输出:
模拟去db查询~~~1
---------------------------------
demoCache
hello cache...
从打印结果的两个可以证明缓存生效了:
getFromDB(1) 调用了两次,但日志只输出一句,证明第二次并没有执行方法体,缓存生效- 校验代码中,可以拿到名为
demoCache 的这个Cache对象,并且该Cache内是存在key=1 这个键值对的,证明结果确实存入到缓存里了
|