Spring AOP AfterThrowing问题

时间:2013-09-27 04:57:58

标签: spring

请澄清以下内容:     问题是:     为什么首先执行@AfterThrowing建议然后打印异常。     根据定义,我应首先看到Exception,然后是@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(){
致电@Before Advice
呼叫加入点 - 最初抛出异常。
致电@After投掷建议
//框架工作不能首先抛出异常,因为它丢失了在覆盖的setName()方法中运行@AfterThrowing建议的句柄。所以首先执行@After Throwing Advice并抛出异常 }

1 个答案:

答案 0 :(得分:0)

为什么要先看到异常?基本上AfterThrowing在从方法抛出异常之后。 AfterThrowing可以处理或修改异常。所以它会在捕获之前出现。