spring基础知识 (20):返回通知&异常通知&环绕通知
AspectJ 支持 5 种类型的通知注解:
- @Before: 前置通知, 在方法执行之前执行
- @After: 后置通知, 在方法执行之后执行,不管是否正常结束都会执行。无法访问返回值。
- @AfterRunning: 返回通知, 在方法返回结果之后执行,正常结束才会执行。能够访问到返回值。
- @AfterThrowing: 异常通知, 在方法抛出异常之后
- @Around: 环绕通知, 围绕着方法执行
返回通知
使用@AfterRunning注解, 方法正常执行完后调用,如果有异常,则不调用 可以访问到方法的返回值
异常通知
使用@AfterThrowing注解, 在方法抛出异常之后,并且和指定的异常相同或者是其父类可以执行。
如:入参为NullPointException ex,那么只有在发生空指针异常时才执行
@AfterThrowing(value="execution(* com.spring.aop.*.*(..))",throwing="ex")
public void afterThrowing(JoinPoint joinPoint,Exception ex){
//方法名
String methodName = joinPoint.getSignature().getName();
System.out.println("method "+methodName+" occurs:"+ex);
}
这里异常参数使用的是Exception 类型的,当发生Exception 或者其子类异常后都可以执行本方法。
环绕通知
- 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点.
- 对于环绕通知来说, 连接点的参数类型必须是 ProceedingJoinPoint . 它是 JoinPoint 的子接口, 允许控制何时执行, 是否执行连接点.
- 在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行.
- 注意: 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常
看代码:
/** * 环绕通知需要携带ProceedingJoinPoint类型的参数 * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint这个类型的参数可以决定是否执行目标方法 * 且环绕通知必须有返回值,返回值即为目标方法的返回值 * @param pjd */
@Around("execution(* com.spring.aop.*.*(..))")
public Object around(ProceedingJoinPoint pjd){
Object result = null;
String methodName = pjd.getSignature().getName();
try {
//前置通知
System.out.println("method:"+methodName+" begins with "+Arrays.asList(pjd.getArgs()));
//执行目标方法
result = pjd.proceed();
//返回通知
System.out.println("method:"+methodName+" end with "+result);
} catch (Throwable e) {
// 异常通知
System.out.println("method:"+methodName+" occurs exception "+e);
}
//后置通知
System.out.println("method ends");
return result;
}
环绕通知相当于配置了一个动态代理类,可以配置其他四种任意的通知方式。
不常用
本系列参考视频教程: http://edu.51cto.com/course/1956.html
还没有评论,来说两句吧...