次のスケルトンクラスを持つSpringアプリケーションがあります
class ServiceCaller
{
public Result callService()
{
//call a remote service
}
}
リモート サービスの呼び出しはコストのかかる操作であるため、アプリケーションにキャッシュを追加しました。EhCache Spring アノテーションを使用@Cacheable
してメソッドに適用しましたcallService()
。すべてが正常に機能し、Result
オブジェクトが正しくキャッシュされていました。
ServiceCaller
後で、ロガーがリモート サービスへのすべての実際の呼び出しを記録するように、すべての にロガーを追加したいと考えました。logger.info()
そのようなすべてのメソッドに手動で追加したくはなかったcallService
ので、Spring AOP を使用してこれを実装することにしました。
ログに記録したいすべてのメソッドに戻り、ポイントカットを定義しました。それは機能していました。callService
ただし、キャッシュ ヒットがあり、実際のメソッドが呼び出されていない場合でも、ロガー ポイント カットが呼び出されることに気付きました。ServiceCaller
これは、 Beanへのプロキシの順序が次のようになっているために発生していることに気付きましたAOPPointCutProxy(EhCacheCachingProxy(ServiceCallerBean))
。callService
EhCache プロキシからキャッシュされた値を返すときではなく、実際のメソッドが呼び出されたときにのみロガー ポイントカットが呼び出されるようにします。つまり、実際にはプロキシ作成階層を の形式にしたいということですEhCacheCachingProxy(AOPPointCutProxy(ServiceCallerBean))
。私のビーン定義、ポイントカット定義、キャッシュ構成はすべて、ランダムに名前が付けられた異なるxmlファイルにある可能性があることに注意してください。
では、必要な順序でプロキシを作成するように Spring を強制するにはどうすればよいでしょうか。