在 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"),对应的通知方法中可以有一个参数与这个指定的参数名相同,用于接收目标方法抛出的异常。
三、代码样例对比
-
使用
@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); } } -
使用
@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注解在触发时机和方法参数上存在明显差异,可根据具体的需求选择使用,以实现不同情况下的切面逻辑。
4663

被折叠的 条评论
为什么被折叠?



