4

Spring の宣言型キャッシングを使用して処理することを計画していたモジュールを開発しています。キャッシュを使用していくつかのメソッドを作成しました

@Override
@Cacheable("businessUnitCache")
public BusinessUnit getBusinessUnit(String businessUnitId){

クラスパス Bean ファイルとクラスパスeh-cache 構成を提供して、消費プロジェクトが実装の内部とキャッシュする必要があるメソッドを知る必要なく機能を提供することを計画していました (これらのメソッドの多くは、直接アクセスすることはありません)。

ただし、複数のモジュールでSpringキャッシュアノテーションを使用するという質問とその回答を読むと、消費するプロジェクトのいずれかがSpringキャッシュアノテーションも使用するため、明らかに問題が発生します。注釈に一致するキャッシュが宣言されていない場合、Sprint が黙って失敗することを期待していましたが、次のエラーで失敗します。

java.lang.IllegalArgumentException: CacheableOperation[public の [businessUnitCache] という名前のキャッシュが見つかりません

キャッシュ注釈を使用できないという結論に導きます (これは、質問からの元の結論と矛盾します。複数の ehcache.xml を使用することは可能ですか (異なるプロジェクトで、同じ戦争で)? . 私のテストはこれを裏付けています。

では、できればxmlで、実装クラスとは別にキャッシングを宣言することは可能ですか? これにより、キャッシング ルールを使用して追加のファイルを準備し、標準のスプリング プロパティの置換を使用してキャッシュ マネージャー名を置き換えることができます (データソースで既に同様のことを行っています)。残念ながら、リファレンス ドキュメントには、アノテーション ベースの構成しか記載されていません。

4

1 に答える 1

3

xml ファイルを使用してキャッシュを構成できます。Spring リファレンス マニュアルを参照してください。

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/cache.html#cache-declarative-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 behaviour to all BookService interfaces -->
<aop:config>
<aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/>
</aop:config>
于 2012-08-08T09:46:40.707 に答える