注解驱动的缓存

来源:互联网 发布:地下城与勇士台服源码 编辑:程序博客网 时间:2024/05/16 14:52

5.7.3  注解驱动的缓存

除了前面介绍的基于XML的缓存配置,Spring Modules还支持使用代码级元数据声明缓存。这种支持有两种形式:

Java 5注解:如果目标环境是Java 5平台,这就是很理想的解决方案。

Jakarta公共属性:如果目标环境是Java 5以前的平台,就应该选择它。
对于RoadRantz程序来说,其目标环境是Java 5,所以我们要使用Java 5注解来声明DAO层的缓存。对于缓存,Spring Modules提供了两个注解:

@Cacheable:声明一个方法的返回值应该被缓存。

@CacheFlush:声明一个方法是清空缓存的触发器。

利用@Cacheable注解,我们可以像下面这样把getRantsForDay()声明为要被缓存的:

  

modelId属性指定用于缓存方法返回值的模型,稍后我们介绍说明如何定义缓存模型,现在先来看一看如何使用@CacheFlush来指定saveRant()被调用时的缓存清空操作:


  

modelId属性指定的刷新模型会在saveRant()方法被调用时被清空。

既然说到缓存模型和刷新模型,那么它们是从何而来的呢?元素被用于启动Spring Modules对注解的支持,我们会在roadrantzcache.xml文件里像下面这样配置它:

  

在元素里,必须配置至少一个元素,它就定义了一个缓存模型。简单来说,缓存模型基本上就是对ehcache.xml里配置的一个缓存的引用。本例中,我们把rantzCacheModel与名为rantzCache的缓存关联起来,这样一来,任何modelId是rantzCacheModel的@Cacheable都会使用名为rantzCache的缓存。

刷新模型与缓存模型相当类似,只是它引用的是要被刷新的缓存。下面使用元素创建一个名为rantzFlushModel的刷新模型:

 设置缓存模型与刷新模型的不同之处在于,刷新模型不仅决定要清空哪个缓存,还决定了何时清空。在默认情况下,缓存是在@CacheFlush注解的方法被调用之后清空的,但我们可以通过指定<ehcache:flushing>的when属性来改变:
  把when属性设置为before之后,缓存就会@CacheFlush注解的方法被调用之前清空。