0

メソッドのすべての実行に一致するポイントカットを書くことに混乱しています。class のすべてのメソッド実行に一致するはずのポイントカットを試しましたAlpha:

execution(* Alpha.*(..))

次のクラス階層で

public class Alpha {
    public void alphaMethod() {...}
}
public class Beta extends Alpha {
    public void betaMethod() {
        alphaMethod();
    }
}

Main-program が -instance を呼び出す場合、alphaMethodアドバイスBetaは期待どおりに呼び出されbetaMethodますalphaMethodが、アドバイス内で呼び出す Main-program 呼び出しは呼び出されず、その理由がわかりません。

アスペクト定義:

@Aspect
public class MyAspect {
    @Before(value = "execution(* Alpha.*(..))", argNames="joinPoint")
    public void myAdvice(JoinPoint joinPoint) {
        System.out.println("BEFORE: " + joinPoint.getSignature());
    }
}

メインメソッド:

Beta beta = ...;
beta.alphaMethod(); //advice is called
beta.betaMethod(); //advice is NOT called.
4

2 に答える 2

1

すでに答えたように、その理由は明らかです。これを修正するには、プロキシの代わりにロード時のウィービングを使用するか(AspectJに依存していない場合は、AspectJへの依存関係があると思います)、またはBeanを依存関係としてそれ自体に注入してから実装します。

public void betaMethod() {
    selfBean.alphaMethod();
}

selfBeanはと同じ参照ではないため、これは機能thisします。前者はプロキシへの参照であり、後者は元のプロキシされたオブジェクトへの参照です。

于 2012-05-27T17:08:41.500 に答える
1

これは予期されることです。

Spring AOP はプロキシ クラスを使用して、アドバイスされた Bean をラップします。alphaMethod()メソッド内から呼び出すとBeta、プロキシはそれを認識しません。

詳細については、この回答を参照してください。

于 2012-05-27T15:50:04.383 に答える