知道的,都说说,我也在百度,google,如果明白的,讲讲,一定要详细,白话文,能听懂,
零基础想会用,先会用再再深入。
人人都有分,不带保留的回复,谢谢,谢谢!

解决方案 »

  1.   

    顾名思义:
    前置是在有这种调用目标方法的企图时就会干预。
    A extends TargetClass {
        public void targetMethod() {
            beforeAdvice();
            super.targetMethod();
        }
    }
    后置是在调用正常返回时才干预。
    A extends TargetClass {
        public void targetMethod() {
            super.targetMethod();
            afterAdvice();
        }
    }异常时调用后得到一个异常才干预。
    A extends TargetClass {
        public void targetMethod() {
            try {
                 super.targetMethod();
            } catch (ExpectedException e){
                 afterExceptionAdvice();
            }
            
        }
    }
    AspectJ (另一种 AOP) 它还支持 Spring AOP 在 JDK 1.5 之前不支持的特性 - Around Advice,
    Around Advice 是对这个方法进行推断,满足你的条件才调用,不满足条件时可以跳过原来的方法,但当然该返回什么类型的值你的 advice 还是得照样返回,比如你返回一个 null 或 throw 一个签名中允许的异常,根据你的需要决定。A extends TargetClass {
        public void targetMethod() {
            if (expectedCondition == true) {
                 super.targetMethod();// 用 AspectJ 来写是 proceed();
            } else {
                 // do nothing.
            }
        }
    }比如:下面这个是 AspectJ 的写法:void around(): updateBalance() {
      String account = (String) thisJoinPoint.getArgs()[0];
      BigDecimal balance = (BigDecimal) thisJoinPoint.getArgs()[1];  if (account == null || account.equals("0") 
                || balance == null || balance.signnum() == -1) {
         throw new IllegalArgumentException("Invalid account");
      } else {
         proceed(); // 调用原来的方法。
      }
      
    }Spring 没提供 Around Advice 因为它不方便像 AspectJ 那样还可以写一段代码来决定是否 proceed。AspectJ 的特点是它直接个性编译后的字码或在类加载过程中修改字节码,使得它可以实现更多的功能,比如它能够为“将要访问一个字段的值”提供 advice (不是调用 getter 方法),还支持 introduction (比如,为一个本来没有实现 Serializable 接口的类实现 Serializable 接口,或为一个类添加成员方法或变量),当然修改字节码这个事情也没办法给构造函数来个 advice 了。