执行节点
- @After:无论方法是正常返回还是抛出异常,都会执行。
- @AfterReturning:只在方法正常返回后执行,可以访问方法的返回值。
- @AfterThrowing:只在方法抛出异常时执行,可以访问异常信息。
使用场景
- @After:适用于在方法执行后进行清理工作或记录日志。
- @AfterReturning:适用于在成功返回结果后处理返回值,例如格式化或记录日志。
- @AfterThrowing:适用于异常处理场景,记录异常或触发错误处理机制。
@After示例
@Aspect
@Component
public class LoggingAspect {
@After("execution(* com.example.service.HelloService.hello(..))")
public void logAfter() {
System.out.println("After method execution");
}
}
@AfterReturning示例
此示例中,参数result就是被监听函数的返回值。在logAfterReturning中可以对返回值做一些处理。
@Aspect
@Component
public class LoggingAspect {
@AfterReturning(pointcut = "execution(* com.example.service.HelloService.hello(..))", returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned value is : " + result);
}
}
@AfterThrowing示例
需要注意的是,该注解只能抓捕未被自己代码处理的异常,加入在业务逻辑中对代码进行了try…catch之后,该注解无法触发。
@Aspect
@Component
public class LoggingAspect {
@AfterThrowing(pointcut = "execution(* com.example.service.HelloService.hello(..))", throwing = "ex")
public void logAfterThrowing(Exception ex) {
System.out.println("An exception has been thrown: " + ex);
}
}
execution说明
execution用于指定监听范围。execution可以有很多写法,下面会介绍几种。
“execution(public * com.example.demo.service.impl.AccountServiceImpl.aopBeforeMsg(…))”
“execution(* com.example.demo.service.impl.AccountServiceImpl.aopBeforeMsg(…))”
以上两种写法都表明监听com.example.demo.service.impl.AccountServiceImpl类下的aopBeforeMsg函数。
“execution(public * com.example.demo.service.impl.AccountServiceImpl.*(…))”
以上表明监听AccountServiceImpl类下的所有函数。
“execution(public * com.example.demo.service.impl.AccountServiceImpl.get*(…))”
以上写法表明监听AccountServiceImpl类下所有get开头函数。
"execution(public * com.example.demo.service.impl.AccountServiceImpl.get*(…)) || || execution(* com.example.service.OrderService.get*(…)) "
以上写法表示监听AccountServiceImpl类与OrderService类中get开头的函数。
“execution(* com.example.service…*(…))”
以上写法表示监听service包下的所有函数。