spring基础知识 (20):返回通知&异常通知&环绕通知

男娘i 2022-05-25 11:08 666阅读 0赞

AspectJ 支持 5 种类型的通知注解:

  • @Before: 前置通知, 在方法执行之前执行
  • @After: 后置通知, 在方法执行之后执行,不管是否正常结束都会执行。无法访问返回值。
  • @AfterRunning: 返回通知, 在方法返回结果之后执行,正常结束才会执行。能够访问到返回值。
  • @AfterThrowing: 异常通知, 在方法抛出异常之后
  • @Around: 环绕通知, 围绕着方法执行

返回通知

使用@AfterRunning注解, 方法正常执行完后调用,如果有异常,则不调用 可以访问到方法的返回值


异常通知

使用@AfterThrowing注解, 在方法抛出异常之后,并且和指定的异常相同或者是其父类可以执行。
如:入参为NullPointException ex,那么只有在发生空指针异常时才执行

  1. @AfterThrowing(value="execution(* com.spring.aop.*.*(..))",throwing="ex")
  2. public void afterThrowing(JoinPoint joinPoint,Exception ex){
  3. //方法名
  4. String methodName = joinPoint.getSignature().getName();
  5. System.out.println("method "+methodName+" occurs:"+ex);
  6. }

这里异常参数使用的是Exception 类型的,当发生Exception 或者其子类异常后都可以执行本方法。


环绕通知

  • 环绕通知是所有通知类型中功能最为强大的, 能够全面地控制连接点. 甚至可以控制是否执行连接点.
  • 对于环绕通知来说, 连接点的参数类型必须是 ProceedingJoinPoint . 它是 JoinPoint 的子接口, 允许控制何时执行, 是否执行连接点.
  • 在环绕通知中需要明确调用 ProceedingJoinPoint 的 proceed() 方法来执行被代理的方法. 如果忘记这样做就会导致通知被执行了, 但目标方法没有被执行.
  • 注意: 环绕通知的方法需要返回目标方法执行之后的结果, 即调用 joinPoint.proceed(); 的返回值, 否则会出现空指针异常

看代码:

  1. /** * 环绕通知需要携带ProceedingJoinPoint类型的参数 * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint这个类型的参数可以决定是否执行目标方法 * 且环绕通知必须有返回值,返回值即为目标方法的返回值 * @param pjd */
  2. @Around("execution(* com.spring.aop.*.*(..))")
  3. public Object around(ProceedingJoinPoint pjd){
  4. Object result = null;
  5. String methodName = pjd.getSignature().getName();
  6. try {
  7. //前置通知
  8. System.out.println("method:"+methodName+" begins with "+Arrays.asList(pjd.getArgs()));
  9. //执行目标方法
  10. result = pjd.proceed();
  11. //返回通知
  12. System.out.println("method:"+methodName+" end with "+result);
  13. } catch (Throwable e) {
  14. // 异常通知
  15. System.out.println("method:"+methodName+" occurs exception "+e);
  16. }
  17. //后置通知
  18. System.out.println("method ends");
  19. return result;
  20. }

环绕通知相当于配置了一个动态代理类,可以配置其他四种任意的通知方式。
不常用


本系列参考视频教程: http://edu.51cto.com/course/1956.html

发表评论

表情:
评论列表 (有 0 条评论,666人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring-环绕通知 @Around 注解

    > 环绕通知:常用于做事务,事务开启,执行方法。在目标方法执行之前之后执行。 > 被注解为环绕增强的方法要有返回值,Object类型。并且方法可以包含一个Proceedin