• spring: 创建环绕通知


    package ch2.test;
    
    public interface Performance {
    	void perform();
    }
    

      

    package ch2.test;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect
    public class Aodience3 {
    
    	
    	//定义命名(被重复使用)的切点
    	@Pointcut("execution(** Performance.perform(..))")
    	public void Performance(){}
    	
    	
    	//环绕通知方法
    	@Around("Performance()")
    	public void watchPerformance(ProceedingJoinPoint pj)
    	{
    		
    		try {
    			System.out.println("silen Cell Phones");
    			System.out.println("taking seats");		
    			pj.proceed();//被执行通知的方法
    			System.out.println("clap clap");
    		} catch (Throwable e) {
    			// TODO Auto-generated catch block
    			//e.printStackTrace();
    			System.out.println("demand refund");
    		}
    		
    	}
    	
    }
    

      

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

  • 相关阅读:
    [Swift]LeetCode1035.不相交的线 | Uncrossed Lines
    [Swift]LeetCode1034.边框着色 | Coloring A Border
    [Swift]LeetCode1033. 移动石子直到连续 | Moving Stones Until Consecutive
    [Swift]美人征婚问题
    [Swift]动态变化顶部状态栏(statusBar)的颜色
    [Swift-2019力扣杯春季决赛]4. 有效子数组的数目
    [Swift-2019力扣杯春季决赛]3. 最长重复子串
    [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串
    转 ORA-12638: 身份证明检索失败
    转 构建镜像
  • 原文地址:https://www.cnblogs.com/achengmu/p/8316015.html
Copyright © 2020-2023  润新知