缓存的代理Bean

5.7.2  缓存的代理Bean

我们已经知道HibernateRantDao里的getRantsForDay()方法很适合进行缓存。再回到Spring上下文定义,我们要使用<ehcache:proxy>元素把一个代理包裹到HibernateRantDao,从而缓存从getRantsForDay()返回的全部内容:

  

<ehcache:caching>元素声明哪个方法要被拦截、其返回值要保存到哪个缓存。本例中,methodName被设置为getRantsForDay(),要使用的缓存是rantzCache。

我们可以根据需要在<ehcache:proxy>里声明多个<ehcache:cacing>来描述Bean方法的缓存。我们可以让一个<ehcache:caching>用于所有被缓存的方法,也可以使用通配符为一个<ehcache:caching>元素指定多个方法。比如下面的<ehcache:caching>元素会代理缓存全部名称由get开头的方法:

  

把数据放到缓存里只完成了一半的工作。在经过一段时间之后,缓存里一定会包含大量数据,其中很多已经没有意义了。最后,这些数据应该被清出缓存,数据缓存周期重新开始。下面我们来看一看如何在方法调用时刷新缓存。

刷新缓存

<ehcache:caching>元素声明的是要向缓存中添加数据的方法,而<ehcache:flushing>元素声明了会清空缓存的方法。举例来说,假设我们想在saveRant()方法被调用时清空rantzCache缓存,那么就应该使用如下的<ehcache:flushing>元素:


  
在默认情况下,cacheName属性里指定的缓存会在methodName被调用之后清空,但利用when属性可以指定清空的时机:
 
  

把when属性设置为before可以让缓存在saveRant()被调用之前清空。

声明一个被代理的内部Bean

注意<ehcache:proxy>的id和refId属性。由<ehcache:proxy>生成的代理的id是rantDao,然而这是HibernateRantDao Bean的id,因此,我们需要把这个真正的Bean重命名为rantDaoTarget(由refId属性指定)。(这与传统Spring AOP代理及其目标的命名方式是一样的,详情请见4.2.3小节。)

如果觉得id/refId组合有些奇怪,我们还可以把目标Bean声明为<ehcache:proxy>的内部Bean。举例来说,下面就是把HibernateRantDao配置为一个内部Bean的<ehcache:proxy>:

  

即使使用了内部Bean,我们仍然需要为每个要代理的Bean声明一个<ehcache:proxy>元素,为方法声明一个或多个<ehcache:caching>元素。对于简单程序来说,这样做不会有什么问题,但随着代理缓存Bean和方法的数量不断增加,这将意味着Spring配置里越来越多的XML。

如果对内部Bean的方法仍然感到不快,或是需要代理多个要缓存的Bean,我们可以考虑使用Spring Modules对注解声明缓存的支持。接下来,让我们忘记<ehcache:proxy>,看一看Spring Modules如何支持注解驱动的缓存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章