1.JoinPoint和ProceedingJoinPoint接口
接口 | 定义 | 功能 | 适用通知类型 |
---|---|---|---|
JoinPoint | 代表了在程序执行过程中的连接点 | 获取到连接点(被拦截方法)的名称、参数、目标对象以及代理对象等信息 | 前置、后置、返回后、抛出异常后通知 |
ProceedingJoinPoint | 是 JoinPoint 接口的子接口,除了继承了 JoinPoint 的所有功能外,还增加了一个非常关键的方法 proceed() | 通过 proceed() 方法,可以决定是否继续执行被拦截的方法以及如何执行 | 环绕通知 |
2.通知获取数据分类
分类 | 适用通知类型 |
---|---|
获取参数 | 前置、后置、环绕、返回后、抛出异常后通知 |
获取切入点方法返回值 | 环绕、返回后通知 |
获取切入点方法运行异常信息 | 环绕、抛出异常后通知 |
3.获取参数
(1)前置、后置、返回后、抛出异常后通知
@Before("切入点方法名()")
public void advice(JoinPoint jp) {
// 获取切入点方法参数
Object[] args = jp.getArgs();
}
(2)适用于环绕通知
@Around("切入点方法名()")
public Object advice(ProceedingJoinPoint pjp) throws Throwable {
// 获取切入点方法参数
Object[] args = pjp.getArgs();
}
4.获取返回值
(1)环绕通知
@Around("切入点方法名()")
public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
// 对原始操作的调用,并接收其返回值
Object proceed = pjp.proceed();
return proceed;
}
(2)返回后通知
注:如果返回后通知同时获取参数和返回值,通知的形参必须是JoinPoint形参在前,接收返回值的形参在后
@AfterReturning(value = "切入点方法名()" ,returning = "ret(通知方法中用来接收返回值的形参名)")
public void afterReturning(Object ret) {
System.out.println("返回后通知获取切入点方法返回值:" + ret);
}
5.获取异常
(1)环绕通知
@Around("切入点方法名()")
public Object aroundAdvice(ProceedingJoinPoint pjp) {
Object proceed = null;
try {
proceed = pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return proceed;
}
(2)抛出异常后通知
@AfterThrowing(value = "切入点方法名()", throwing = "e(通知方法中用来接收异常的形参名)")
public void afterThrowing(Throwable e){
e.printStackTrace();
}