4

次のスケルトンクラスを持つ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))callServiceEhCache プロキシからキャッシュされた値を返すときではなく、実際のメソッドが呼び出されたときにのみロガー ポイントカットが呼び出されるようにします。つまり、実際にはプロキシ作成階層を の形式にしたいということですEhCacheCachingProxy(AOPPointCutProxy(ServiceCallerBean))。私のビーン定義、ポイントカット定義、キャッシュ構成はすべて、ランダムに名前が付けられた異なるxmlファイルにある可能性があることに注意してください。

では、必要な順序でプロキシを作成するように Spring を強制するにはどうすればよいでしょうか。

4

1 に答える 1

2

それがOrderedインターフェースの用途です。それをBeanに実装する必要があります。

呼び出しを囲む必要がある、注入されたすべてのプロキシを取得するプロキシを作成できます。その複合プロキシのみが実際の Bean を囲んでいます。呼び出し時に、注入されたプロキシを指定された順序で呼び出します。

于 2013-04-05T19:29:30.643 に答える