以下を明確にしてください: 質問: @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 が実行され、例外がスローされ
ます }