• 匹配优先级Spring攻略学习笔记(3.04)指定Aspect优先级


    文章结束给大家来个程序员笑话:[M]

        一、知识点 

               当雷同连接点上应用了多个aspect时,aspect的优先级是不明确的,除非显式地指定它们的优先级。

               aspect的优先级可以通过现实Ordered口接或者用使@Order注解现实。

        二、代码示例

              (1)现实Ordered口接    

    package com.codeproject.jackie.springrecipesnote.springaop;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.Ordered;
    
    /**
     * @author jackie
     * 
     */
    @Aspect
    public class CalculatorValidationAspect implements Ordered{
    	private Log log = LogFactory.getLog(this.getClass());
    	
    	@Before("execution(* *.*(double, double))")
    	public void validateBefore(JoinPoint joinPoint) {
    		for (Object arg : joinPoint.getArgs()) {
    			log.info("validate begins...");
    			validate((Double) arg);
    		}
    	}
    
    	private void validate(Double arg) {
    		if (arg < 0) {
    			throw new IllegalArgumentException("Positive numbers only");
    		}
    	}
    
    	@Override
    	public int getOrder() {
    		return 0;
    	}
    } 

      

    package com.codeproject.jackie.springrecipesnote.springaop;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.Ordered;
    
    /**
     * @author jackie
     * 
     */
    @Aspect
    public class CalculatorLoggingAspect implements Ordered{
    	private Log log = LogFactory.getLog(this.getClass());
    
    	/**
    	 * 切入点表达式匹配ArithmeticCalculator口接的add()方法的执行。
    	 * 表达式前导的星号匹配任何修饰符(public、protected和private)和任何回返类型。
    	 * 参数列表中的两个点匹配任何量数的参数。
    	 */
    	@Before("execution(* ArithmeticCalculator.add(..))")
    	public void logBefore() {
    		log.info("The method add() begins");
    	}
    
    	@Override
    	public int getOrder() {
    		return 1;
    	}
    }
        每日一道理
    如果只看到太阳的黑点,那你的生活将缺少温暖;如果你只看到月亮的阴影,那么你的生命历程将难以找到光明;如果你总是发现朋友的缺点,你么你的人生旅程将难以找到知音;同样,如果你总希望自己完美无缺,假设你的这一愿望真的能如愿以偿,那么你最大的缺点就是没有缺点。

         只要在Bean配置文件中声明这个aspect的一个Bean例实,以可就在Spring中注册这个aspect:

    <bean class="com.codeproject.jackie.springrecipesnote.springaop.CalculatorLoggingAspect" />
    <bean class="com.codeproject.jackie.springrecipesnote.springaop.CalculatorValidationAspect" />

          注意:aspect的优先级不取决于Bean声明的次序。getOrder()方法回返的值越低就代表越高的优先级。

        (2)@Order注解
          另一种指定优先级的方法是通过@Order注解。次序值在注解值中涌现。

    package com.codeproject.jackie.springrecipesnote.springaop;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.annotation.Order;
    
    /**
     * @author jackie
     * 
     */
    @Aspect
    @Order(0)
    public class CalculatorValidationAspect {
    	private Log log = LogFactory.getLog(this.getClass());
    	
    	@Before("execution(* *.*(double, double))")
    	public void validateBefore(JoinPoint joinPoint) {
    		for (Object arg : joinPoint.getArgs()) {
    			log.info("validate begins...");
    			validate((Double) arg);
    		}
    	}
    
    	private void validate(Double arg) {
    		if (arg < 0) {
    			throw new IllegalArgumentException("Positive numbers only");
    		}
    	}
    }
    package com.codeproject.jackie.springrecipesnote.springaop;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.core.annotation.Order;
    
    /**
     * @author jackie
     * 
     */
    @Aspect
    @Order(1)
    public class CalculatorLoggingAspect{
    	private Log log = LogFactory.getLog(this.getClass());
    
    	/**
    	 * 切入点表达式匹配ArithmeticCalculator口接的add()方法的执行。
    	 * 表达式前导的星号匹配任何修饰符(public、protected和private)和任何回返类型。
    	 * 参数列表中的两个点匹配任何量数的参数。
    	 */
    	@Before("execution(* ArithmeticCalculator.add(..))")
    	public void logBefore() {
    		log.info("The method add() begins");
    	}
    }

          

    文章结束给大家分享下程序员的一些笑话语录: 程序员的愿望
      有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
      上帝: 这个啊!这个不好办啊,你还说下一个吧!
      程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
      上帝: 还是让中国国家打进世界杯.

  • 相关阅读:
    iOS 宏(define)与常量(const)的正确使用
    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
    如何在 GitHub 建立个人主页和项目演示页面
    Git 使用指南(cmd + gui)
    Google C++ 编码规范(中文版)
    SVN服务器搭建和使用
    演化理解 Android 异步加载图片(转)
    Android之断点续传下载(转)
    Android学习笔记——关于onConfigurationChanged(转)
    (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3067444.html
Copyright © 2020-2023  润新知