- 通过切入点表达式可以将相应的参数自动传递给通知方法,例如前边章节讲过的返回值和异常是如何传递给通知方法的。
- 在Spring AOP中,除了execution和bean指示符不能传递参数给通知方法,其他指示符都可以将匹配的相应参数或对象自动传递给通知方法
语法
args(param)
示例
@Before(value="execution(* test(*)) && args(param)", argNames="param") public void before1(String param) { System.out.println("===param:" + param); } |
切入点表达式自动传参
- 首先execution( test(*))匹配任何方法名为test,且有一个任何类型的参数;
- args(param)将首先查找通知方法上同名的参数,并在方法执行时(运行时)匹配传入的参数是使用该同名参数类型,即java.lang.String;如果匹配将把该被通知参数传递给通知方法上同名参数。
其他指示符(除了execution和bean指示符)都可以使用这种方式进行参数绑定
注
- 构造器注入中的参数名注入限制,在class文件中没生成变量调试信息获取不到方法参数名字
- 如果我们通过“argNames”属性指定了参数名,那么就是要我们指定的
示例
@Before(value = " args(param)", argNames = "param") //明确指定了 public void before1(String param){ System.out.println("===param:" + param); }
|
- 如果第一个参数类型是JoinPoint、ProceedingJoinPoint或JoinPoint.StaticPart类型,应该从"argNames"属性省略掉该参数名(可选,写上也对),这些类型对象会自动传入的,但必须作为第一个参数
示例
@Before(value=" args(param)", argNames="param") //明确指定了 public void before1(JoinPoint jp, String param) { System.out.println("===param:" + param); } |
- 如果class文件中含有变量调试信息”将使用这些方法签名中的参数名来确定参数名
示例
@Before(value=" args(param)") //不需要argNames了 public void before1(JoinPoint jp, String param) { System.out.println("===param:" + param); }
|
- 如果没有class文件中含有变量调试信息,将尝试自己的参数匹配算法,如果发现参数绑定有二义性将抛出AmbiguousBindingException异常;对于只有一个绑定变量的切入点表达式,而通知方法只接受一个参数,说明绑定参数是明确的,从而能配对成功。
示例
@Before(value = " args(param)") public void before1(JoinPoint jp, String param){ System.out.println("===param:" + param); } |
以上策略失败将抛出IllegalArgumentException
- 将以上方式全部组合
示例
@Before(args(param) && target(bean) && @annotation(secure)", argNames = "jp,param,bean,secure") public void before5(JoinPoint jp, String param, IPointcutService pointcutService, Secure secure){ …… } |
切入点自动传参
- 切入点传参只需要明确指定"argNames"的参数名
示例
@Pointcut(value="args(param)", argNames="param") private void pointcut1(String param){} @Pointcut(value="@annotation(secure)", argNames="secure") private void pointcut2(Secure secure){}
@Before(value = "pointcut1(param) && pointcut2(secure)", argNames="param, secure") public void before6(JoinPoint jp, String param, Secure secure) { …… } |
来自< https://blog.csdn.net/u011479200/article/details/94157295>