宣告式基於 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:definitionscache 屬性定義目標快取)。