Просьба разъяснить нижеследующее: Вопрос: Почему @AfterTrowing совет выполняется первым, а затем исключается исключение. Исходя из определения, я должен увидеть исключение первого, а затем @AfterThrowingSpring AOP AfterTrowing issue
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)
Редактирование поста и добавление ответа ниже Я считаю, что это ответ, но я не уверен. Кто-то, пожалуйста, подтвердите. Internally Spring создает класс прокси, расширяющий действительный целевой класс (где у вас есть точка объединения). Метод точки соединения переопределен и достигнуты концепции АОП.
перекрываться точку в прокси-классе Регистрация:
SetName() {
Вызов @Before Advice
вызовов Присоединяйтесь точка - исключение первоначально брошено здесь.
Call @After Throwing Advice
// Работа с кадрами не может сначала вызвать исключение, так как оно потеряет дескриптор для запуска @AfterTrowing Advice в переопределенном методе setName(). Таким образом, первый @ после предупреждения броска выполняется и исключение исключено
}
Я думаю, что после бросания приходит перед ловлей. – Bart