1. 程式人生 > 其它 >Spring AOP中 args和arg-names的區別

Spring AOP中 args和arg-names的區別

這兩天在看aop aspectj的各種語法,發現裡面有兩個概念 args和arg-names很容易混淆,網上也基本沒說清楚,所以就動手試了一下,發現還是自己試試比較好理解

先說結論:

args是和execution用在一起,用來過濾要被代理的方法的,如果不和arg-names一起用,那麼用法是args(類名,類名...)。 如果和arg-names(引數名1,引數名2...)一起用,那麼用法是args(引數1,引數2...),其中,引數1和引數2的型別由arg-names所代表的方法的引數確定

arg-names是和代理方法一起用的(就是你要加在被代理的方法之前或者之後的那個方法) arg-names(引數名1,引數名2...) 其中的引數名1 引數名2 和 代理方法的引數名

是一一對應的

至於@args,是用於引數上有指定註解的,反而比較好分辨

舉個例子

先定義一個要被代理的類:

public interface someInterface{
 public void targetFunction(String st, Integer in);
}

public class target implements someInterface{
    public void targetFunction(String st, Integer in){
    System.out.println("我是被代理類");
  }
}

然後是定義代理類

public class aspect{
   public void aspectFunction(Integer in, String st){
    System.out.println("我是代理類,有兩個引數:"+ st +" "+ in);
  } 
}

然後定義xml檔案:

<bean id="targetClass" class="target"/>

<bean id="aspectClass" class="aspect"/>

<aop:config>
    
    <aop:aspect id = "asp1" ref="aspectClass">
        <aop:after pointcut="execution(* *.targetFunction.(..) and args(String,Integer))" method="aspectFunction" />
    </aop:aspect>
    
    <aop:aspect id = "asp2" ref="aspectClass">
        <aop:after pointcut="execution(* *.targetFunction.(..) and args(st,in))" method="aspectFunction" arg-names="st,in"/>
    </aop:aspect>

</aop:config>

如xml檔案中所示,arg是定義於pointcut中的,而arg-names是定義於after等切入位置內的。

args是和execution用在一起,用來過濾要被代理的方法的,如果不和arg-names一起用,那麼用法是args(類名,類名...)。 如果和arg-names(引數名1,引數名2...)一起用,那麼用法是args(引數1,引數2...),其中,引數1和引數2的型別由arg-names所代表的方法的引數確定

arg-names是和代理方法一起用的(就是你要加在被代理的方法之前或者之後的那個方法) arg-names(引數名1,引數名2...) 其中的引數名1 引數名2 和 代理方法的引數名是一一對應的