切入点指示符中的arg()
两种用法
1、arg(类型, 类型, …)
@After(value = "execution(* ziy.ann.test.B.*(..))
&& args(String, int, Object)")
public void arg2() {
System.out.println("====增强处理2====");
}
/*
传入一系列类型,表示只有当目标方法的参数类型与之完全匹配才可以匹配该切入点
*/
2、arg(param1, param2,param3,…)
@Before(value = "execution(* ziy.ann.test.B.*(..))
&& args(name, age, obj)", argNames = "name, age, obj")
public void arg(String name, int age, Object obj) {
System.out.println("====增强处理====");
System.out.println(name);
}
/*
传入增强方法的形参名
因为如果AOP代理对象要调用该方法,那就必须传入三个参数,所以
args()、 argNames/arg-names 、Advice方法形参列表,的形参名必须一样,形参列表的类型必须保证能够被赋值
*/
总结:
- args()、argNames/arg-names、Advice方法形参列表
1、args():是一个切入点指示符,通常用于限定匹配,可以传入类型或者形参名
args(java.lang.String):限定匹配只有一个参数的方法连接点
args(param1, param2):限定匹配目标方法形参列表有两个参数的方法连接点(并不要求参数名和目标方法的相同)
++++++++++++++++++++++++++++++
2、argNames/arg-names都输入切入点的属性
用于限制args()和Advice形参列表中的参数名和个数达到完全相同,也就是说
其余两个的参数名和个数必须和本属性的参数名、个数、顺序 一模一样
++++++++++++++++++++++++++++++
3、Advice方法参数列表
AOP代理对象如果要调用Advice必须传入能够满足的参数
特殊情况:当Advice形参列表中存在着JoinPoint类型(被Spring自动传参赋值的形参)时,argNames/arg-names可以不用写这个形参(也可以写),但是其他参数必须按照如上规则写。就算写了,args()中也不需要且不能写,因为args()最终功能是来限定匹配的,而不是为了和argNames()相同
@Around(value = "execution(* ziy.ann.test.B.*(..))
&& args(name, age, obj)", argNames = "name, age, obj")
public void arg3(ProceedingJoinPoint point, String name, int age, Object obj) throws Throwable {
System.out.println("arount处理");
point.proceed(new Object[]{new String("姓名"), 12, new Object()});
System.out.println(name+" >>>> "+age);
}