Spring arg系列

it2026-06-19  8

切入点指示符中的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); }

我认为应该保证三个的参数名和个数都相同

最新回复(0)