1

以下を明確にしてください: 質問: @AfterThrowing アドバイスが最初に実行され、次に例外が出力されるのはなぜですか。定義に基づいて、最初に例外が表示され、次に @AfterThrowing が表示されるはずです

    public class LoggingAspect {


        @AfterThrowing(value = "execution(public void setName(String))")
        public void afterSetNameAdvice(JoinPoint joinPoint) {
            System.out.println("After:"+joinPoint.toString());
            }

        @Before(value = "execution(public void setName(String))")
        public void beforeSetNameAdvice(JoinPoint joinPoint) {
            System.out.println("Before:"+joinPoint.toString());
            }

SetName Method:

    public void setName(String name) {
        this.name = name;

        throw(new ArithmeticException());

    }

Output:

Before:execution(void com.spring.Employee.setName(String))
After:execution(void com.spring.Employee.setName(String))
Exception in thread "main" java.lang.ArithmeticException
    at com.spring.Employee.setName(Employee.java:41)

投稿を編集し、以下の回答を追加すると、これが回答だと思いますが、よくわかりません。誰か確認してください。内部的に、Spring は実際のターゲット クラス (Join ポイントがある場所) を拡張するプロキシ クラスを作成します。Join point メソッドがオーバーライドされ、AOP の概念が実現されます。

プロキシ クラスのオーバーライドされた参加ポイント:

setName(){
Call @Before Advice
Call Join Point -- 例外はもともとここでスローされます。
Call @After Throwing Advice
//フレーム作業は、オーバーライドされた setName() メソッドで @AfterThrowing Advice を実行するためのハンドルを失うため、最初に例外をスローできません。したがって、最初に @After Throwing Advice が実行され、例外がスローされ
ます }

4

1 に答える 1

0

最初に例外を確認する必要があるのはなぜですか? 基本的AfterThrowingに、メソッドから例外がスローされた後と同じです。はAfterThrowing、例外を処理または変更できます。だから、それはキャッチの前に来ます。

于 2013-09-27T06:30:08.593 に答える