学习spring第6天(aop获取目标方法参数)

关于<aop:around>中的方法,需要第一个参数为ProceedJoinPoint,在方法体中通过该参数调用proceed()才能使目标方法得到调用

当一个切面中有多个<aop:around>,而每个around的切点方法都有一个proceed(),目标方法还只是执行一次那么按照顺序调用:外里proceed()里外。

就好比从正面看一个人,首先看到他的第一件外套,在看到他的内衣,再是肉体,肉体就是目标方法,而从肉体出来,后面是内衣,再是外套。

使用ProceedJoinPoint参数的getArgs()可以得到目标方法的参数,如果目标方法有返回值,around的方法也应该有返回值,返回proceed()的结果。

around因为有ProceedJoinPoint类型的参数所以获取目标方法的参数比较方便,同样的因为getArgs()是JoinPoint接口中定义的,所以before,after之类的若想获得目标方法的参数这可以通过这种手段,但是还有另外一种方法:

1.在配置文件中,指明pointcut有一个表达式,例expression="execution(* com.*.*(..)) and args(x,y)",其中and args(x,y)就是目标参数的获取手段。

x,y必须和aop方法中的参数名称一样,原理是从目标方法中获取参数的值后传递给了args(x,y)中的x和y,再传递args传递给aop方法中的参数。但是因为args()中的参数是对应aop方法的参数的,而目标方法的参数是传递给args()的,也就是说这3方必须参数个数一致,不计算JoinPoint类型参数。别名也是对应aop方法参数,args()对应别名。

但是这个样子就导致了配置文件和java方法中的参数联系太过紧密,因此spring还提供了取别名的能力——arg-names,它是<aop:around/before/...>中的属性,值之间用","隔开,只要个数与aop方法参数个数一样就行了。虽然因为是按顺序和aop方法参数对应的,但如果第一个参数是JoinPoint,会忽视JoinPoint参数往后对应

取了别名之后,and args(xx)中的参数名称就是和别名一样了。

原文地址:https://www.cnblogs.com/woyujiezhen/p/11736913.html