0

私の知る限り、Spring AOP では、メソッド呼び出しを傍受したい場合、必要なメソッド呼び出しに一致するポイントカット構成を持つアスペクトを構成します。つまり、アスペクト側で傍受を構成します。

反対側、つまり、呼び出しがインターセプトされるメソッドで完全に構成する方法はありますか? 私はこのようなことが可能であることを期待しています:

@Component
class MyClass {
    @Intercept(interctptor="myInterceptor", method="invoke")
    Object methodThatWillBeIntercepted(Object arg) {
        // ..
    }
}

@Component(value="myInterceptor")
class MyInterceptor {
   Object invoke(MethodInvocation mi) {
      // ...
      if (someCondition) {
         return mi.proceed();
      } else {
         return someOtherValue;
      }
   }
}
4

1 に答える 1

1

少なくとも AspectJ で使用している場合は可能です。ポイントカット宣言で構文を使用して@annotation(com.mycompany.MyAnnotation)、注釈で注釈が付けられた要素を対象にすることができます。詳細については、Spring リファレンス ドキュメントのセクション 9.2.3 を参照してください。

AspectJ を使用しておらず、一般的なプロキシ ベースのインターセプタを使用している場合、チェックしたいすべてのオブジェクトをプロキシし、メソッド呼び出し引数をチェックして、メソッドに注釈が付けられているかどうかを確認するのが「ブルート フォース」アプローチです。このようなもの:

class MyInterceptor {
    public Object invoke(MethodInvocation mi) {
        if(mi.getMethod().getAnnotation(MyAnnotationClass.class) != null) {
            // Do the interception
        }
        else {
            return mi.proceed();
        }
    }
}

MethodInvocation の正確な API は覚えていませんが、そのようなものです。

于 2013-04-02T12:15:27.563 に答える