当前位置:   article > 正文

spring: 创建环绕通知

springmvc 3.7 定义环绕通知
  1. package ch2.test;
  2. public interface Performance {
  3. void perform();
  4. }

  

  1. package ch2.test;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.annotation.Aspect;
  4. import org.aspectj.lang.annotation.Around;
  5. import org.aspectj.lang.annotation.Pointcut;
  6. @Aspect
  7. public class Aodience3 {
  8. //定义命名(被重复使用)的切点
  9. @Pointcut("execution(** Performance.perform(..))")
  10. public void Performance(){}
  11. //环绕通知方法
  12. @Around("Performance()")
  13. public void watchPerformance(ProceedingJoinPoint pj)
  14. {
  15. try {
  16. System.out.println("silen Cell Phones");
  17. System.out.println("taking seats");
  18. pj.proceed();//被执行通知的方法
  19. System.out.println("clap clap");
  20. } catch (Throwable e) {
  21. // TODO Auto-generated catch block
  22. //e.printStackTrace();
  23. System.out.println("demand refund");
  24. }
  25. }
  26. }

  

在这里,@Around注解表明watchPerformance()方法会作为performance()切点的环绕通知。在这个通知中,观众在演出之前会将手机调至静音并就坐,演出结束后会鼓掌喝彩。像前面一样,如果演出失败的话,观众会要求退款。
可以看到,这个通知所达到的效果与之前的前置通知和后置通知是一样的。但是,现在它们位于同一个方法中,不像之前那样分散在四个不同的通知方法里面。
关于这个新的通知方法,你首先注意到的可能是它接受ProceedingJoinPoint作为参数。这个对象是必须要有的,因为你要在通知中通过它来调用被通知的方法。通知方法中可以做任何的事情,当要将控制权交给被通知的方法时,它需要调用ProceedingJoinPoint的proceed()方法。
需要注意的是,别忘记调用proceed()方法。如果不调这个方法的话,那么你的通知实际上会阻塞对被通知方法的调用。有可能这就是你想要的效果,但更多的情况是你希望在某个点上执行被通知的方法。
有意思的是,你可以不调用proceed()方法,从而阻塞对被通知方法的访问,与之类似,你也可以在通知中对它进行多次调用。要这样做的一个场景就是实现重试逻辑,也就是在被通知方法失败后,进行重复尝试。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/846764
推荐阅读
相关标签
  

闽ICP备14008679号