在Spring AOP中,@AfterReturning注解和@AfterThrowing注解的区别是什么?

在 Spring AOP 中,@AfterReturning注解和@AfterThrowing注解有以下区别:

一、触发时机不同

  • @AfterReturning:在目标方法正常执行完成并返回结果后触发。它在目标方法成功执行,没有抛出任何异常的情况下被调用。
  • @AfterThrowing:在目标方法抛出异常时触发。当目标方法执行过程中抛出了异常,该注解所标注的通知方法会被执行。

二、方法参数不同

  • @AfterReturning:可以接收一个returning属性指定的参数名,用于获取目标方法的返回值。例如:@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result"),对应的通知方法中可以有一个参数与这个指定的参数名相同,用于接收目标方法的返回值。
  • @AfterThrowing:可以接收一个throwing属性指定的参数名,用于获取目标方法抛出的异常。例如:@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex"),对应的通知方法中可以有一个参数与这个指定的参数名相同,用于接收目标方法抛出的异常。

三、代码样例对比

  1. 使用@AfterReturning注解的示例:

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Aspect
    public class LoggingAspect {
    
        private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
        @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
        public void logAfterReturning(JoinPoint joinPoint, Object result) {
            logger.info("After method execution with result: {}", result);
        }
    }
    
  2. 使用@AfterThrowing注解的示例:

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Aspect
    public class LoggingAspect {
    
        private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
        @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
        public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {
            logger.error("After method threw an exception: {}", ex.getMessage());
        }
    }
    

综上所述,@AfterReturning@AfterThrowing注解在触发时机和方法参数上存在明显差异,可根据具体的需求选择使用,以实现不同情况下的切面逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值