私は現在、Spring とその AOP 機能を試しています。
私が知りたいのは、ポイントカット定義の表現言語を何とか拡張できないかということです...
私は、Spring が提供するポイントカット指定子の標準的な動作と使用法に精通していますが、自分のニーズに合わせて独自のものを実装したいと考えています。
アスペクトにメソッドがあるとします。
@Aspect
public class AspectClass {
@Before("execution(* *.get*(..)) && @annotation(someAnnotation)"
public void doStuff(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation) {
System.out.println("Doing stuff!");
}
}
今私が欲しいのは次のようなものです:
...
@Before("execution(* *.get*(..)) && @myAnnotation(someAnnotation)"
public void doStuff(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation){
...
myAnnotation(..)
トークンは、式言語のカスタム拡張です。
Spring の実装を詳しく調べたところ、パーサーが存在する場所と、それがAspectJExpressionPointcut
実装にハードコーディングされていることがわかりました。したがって、上記のパーサーのカスタム実装を提供し、それをいくつかの Bean 初期化ルーチンのどこかに貼り付けることは、ノーノーのように思えます。
この拡張機能の使用例は、たとえば、オブジェクト階層内でのこのアノテーションの近接性を無視して、そのアノテーションによってメソッドを照合することです。したがって、オーバーライドされ、そのアノテーションが親の実装で定義されているメソッドと一致します。
public abstract class Superclass {
@SomeAnnotation
public abstract String getValue();
}
public class TheClass extends Superclass {
@Override
public String getValue() { // <- this would get advised by Spring using formerly defined aspect
// return some stuff
}
}
メソッドをアドバイスに反映させて、スーパークラスのメソッドにアノテーションが存在するかどうかを確認できることはわかっていますが、このプロセスをカプセル化して便利な使い方を提供したいと思います。
皆さんはこのようなことに遭遇しましたか? 解決策 (可能であれば) / 説明 (可能でない場合) を教えてもらえますか? :-)
前もってありがとう、ジャネック。