宣告式 XML 為基礎的快取
如果註解不是一種選項(可能是因為無法存取原始碼或沒有外部程式碼),您可以使用 XML 進行宣告式快取。因此,您可以外部指定目標方法和快取指示(類似於宣告式交易管理 建議),而不是註解方法以進行快取。前一節的範例可以轉換為以下範例
<!-- the service we want to make cacheable -->
<bean id="bookService" class="x.y.service.DefaultBookService"/>
<!-- cache definitions -->
<cache:advice id="cacheAdvice" cache-manager="cacheManager">
<cache:caching cache="books">
<cache:cacheable method="findBook" key="#isbn"/>
<cache:cache-evict method="loadBooks" all-entries="true"/>
</cache:caching>
</cache:advice>
<!-- apply the cacheable behavior to all BookService interfaces -->
<aop:config>
<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/>
</aop:config>
<!-- cache manager definition omitted -->
在先前的組態中,bookService
被設為可快取。要應用的快取語意封裝在 cache:advice
定義中,這會導致 findBooks
方法用於將資料放入快取,而 loadBooks
方法用於逐出資料。這兩個定義都針對 books
快取運作。
aop:config
定義透過使用 AspectJ 切入點運算式,將快取建議應用於程式中的適當點(更多資訊請參閱 使用 Spring 的面向切面程式設計)。在先前的範例中,會考量 BookService
中的所有方法,並將快取建議應用於它們。
宣告式 XML 快取支援所有基於註解的模型,因此在兩者之間移動應該相當容易。此外,兩者都可以在同一個應用程式中使用。基於 XML 的方法不會觸及目標程式碼。但是,它本質上更冗長。當處理具有重載方法且目標為快取的類別時,識別正確的方法確實需要額外的努力,因為 method
引數不是一個好的區分器。在這些情況下,您可以使用 AspectJ 切入點來精挑細選目標方法並應用適當的快取功能。然而,透過 XML,更容易應用套件或群組或介面範圍的快取(再次,由於 AspectJ 切入點)並建立類似範本的定義(如同我們在先前的範例中所做的那樣,透過 cache:definitions
cache
屬性定義目標快取)。