宣言的な 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 キャッシングは、アノテーションベースのモデルをすべてサポートしているため、2 つの間を移動するのはかなり簡単です。さらに、両方を同じアプリケーション内で使用できます。XML ベースのアプローチは、ターゲットコードに影響を与えません。ただし、本質的に冗長です。キャッシュの対象となるオーバーロードされたメソッドを持つクラスを処理する場合、method 引数は適切な識別子ではないため、適切なメソッドを識別するには余分な労力がかかります。このような場合、AspectJ ポイントカットを使用して、ターゲットメソッドを選択し、適切なキャッシュ機能を適用できます。ただし、XML を使用すると、パッケージ、グループ、インターフェース全体のキャッシュを適用し(これも、AspectJ ポイントカットのため)、テンプレートのような定義を作成する方が簡単です(前の例で cache:definitions を介してターゲットキャッシュを定義した場合と同様)。cache 属性)。