Spring实战读书笔记
第十三章:缓存数据
启用缓存
-
如果使用Java配置则需要使用@EnableCaching注解开启缓存,XML配置则需要使用cache命名空间的<cache:annotation-driven>。
-
其实在本质上,这两种的工作方式是相同的。它们都会创建一个切面并触发Spring缓存注解的切点。根据所使用的注解以及缓存的状态,这个切面会从缓存中获取数据,将数据添加到缓存中或从缓存中移除某个值。
配置缓存
-
Spring内置了多个缓存管理器实现。Ehcache是最流行的缓存供应商之一,Spring中与之相对应的缓存管理器就是EhcacheCacheManager。
-
Spring提供了EhCacheManagerFactoryBean来生成EhCache的CacheManager。我们要想注册EhcacheCacheManager必须先注册一个EhCacheManagerFactoryBean对象,在创建FactoryBean的过程中,要告诉它Ehcache配置文件的位置。
-
Spring Data Redis提供了RedisCacheManager缓存管理器。在注册RedisCacheManager的时候需要注入一个RedisTemplate对象。
-
有的时候我们可能需要多个缓存管理器,那我们就需要CompositeCacheManager了。我们可以将我们需要的所有缓存管理器装入set集合再作为参数注入给CompositeCacheManager。
缓存注解
-
Spring提供了四个注解来声明缓存规则,分别是@Cacheable、@CachePut、@CacheEvict、@Caching。
-
默认情况下,缓存的key就是方法的参数。不过@Cacheable和@CachePut都有一个key属性,我们可以自定义key。Spring还提供了多个用来定义缓存规则的SpEL扩展(表13.3),我们可以利用这些扩展表达式更好的定义key。
-
@Cacheable和@CachePut还提供了unless和condition两个属性,让我们可以条件化缓存。
-
如果unless属性的SpEL表达式计算结果为true,那么缓存方法返回的数据就不会放到缓存中。如果condition属性的SpEL表达式计算结果为false,那么对于这个方法的缓存就会被禁用。
-
unless只能阻止将对象放入缓存,但在这个方法调用的时候依然会先去缓存中查找,找得到就返回。而condition的结果如果为false会禁用缓存。也就是说,不会去缓存中查找,返回值也不会放入缓存。
-
-
@CacheEvict注解可以放在对数据库操作的remove方法上,当这个数据从数据库中移除的时候,它也应该从缓存中移除。
使用XML声明缓存
-
Spring提供了cache命名空间,所有我们在注解上的操作都可以使用XML实现,而且用法几乎相同。
-
由于缓存是基于切面实现的,所以我们还会用到<aop:config>。