緩存的代理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如何支持註解驅動的緩存。

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