Spring AOP中 args和arg-names的區別
阿新 • • 發佈:2022-05-04
這兩天在看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 和 代理方法的引數名是一一對應的