建议如何利用Spring Aop进行传参

  

建议如何利用Spring Aop进行传参?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>给建议传递参数

建议除了可以接收(非Around通知)的连接点或ProceedingJoinPoint(建议)参数外,还可以直接接收与切入点方法执行有关的对象,比如切入点方法参数,切入点目标对象(目标),切入点代理对象(这)等。

<强> 1获取切入点方法参数

假设我们现在有一个id为userService的bean中定义了一个findById (int id)方法,我们希望定义一个建议来拦截这个方法,并且把findById()的参数作为建议处理方法的参数,即每次调用findById()传递的参数都将传递到建议处理方法,那么我们可以如下这样定义。

@Before (value=https://www.yisu.com/zixun/癰ean执行(userService) & & (* findById (java.lang.Integer)) & & args (id)”,argNames=" id ")   公共空间beforeWithParam(连接点的连接点,整数id) {   System.out.println (this.getClass () . getname () +“ID:“+ ID);   }

上面这种定义是非常精确的定义,我们通过表达式”bean (userService),,执行(* findById (java.lang.Integer))”就已经明确的指定了我们需要拦截的是id或名称为userService的findById(整数)方法,后面又加了一个参数(id)是干什么用的呢?它的作用跟findById(整数)是类似的,它表示我们的切入点方法必须只接收一个参数,而且这个参数的类型是和当前定义的建议处理方法的参数id是相同类型的,在上面的示例中其实就是要求是整数类型的,另外它还有一个非常重要的作用,通过这种指定后对应的建议处理方法在执行时将接收到与之对应的切入点方法参数的值。在上面的示例中笔者特意给建议处理方法加了一个连接点参数是为了说明的连接点,ProceedingJoinPoint参数是可以直接定义在建议方法的第一个参数,并且是可以与其它接收的参数共存的。其实如果我们不只是需要拦截findById(整数)方法,而是需要拦截id为userService的bean中所有接收一个int/整数参数的方法,那么我们可以把上面的配置简化为如下这样。

@Before (value=https://www.yisu.com/zixun/癰ean (userService) & & args (id)”,argNames=" id ")   公共空间beforeWithParam2 (int id) {   System.out.println (this.getClass () . getname () +“ID:“+ ID);   }

如果我们需要拦截的方法可能是有多个参数的,但我们只关注第一个参数,那我们可以把表达式调整为如下这样,只关注第一个参数为int/整数类型的,并且在建议方法中接收这个方法参数进行相应的处理。

@Before (value=https://www.yisu.com/zixun/癰ean (userService) & & args (id, . .)”,argNames=" id ")   公共空间beforeWithParam2 (int id) {   System.out.println (this.getClass () . getname () +“ID:“+ ID);   }

<强> 2 argNames参数

我们可以看到在上述例子中我们都指定了@Before的argNames属性的值为id,那么这个argNames属性有什么作用呢? argNames属性是用于指定在表达式中应用的参数名与建议方法参数是如何对应的,argNames中指定的参数名必须与表达式中的一致,可以与建议方法参数名不一致,当表达式中使用了多个参数时,argNames中需要指定多个参数,多个参数之间以英文逗号分隔,这些参数的顺序必须与对应的建议方法定义的参数顺序是一致的。

比如下面这个示例中,我们在切入点表达式中使用了姓名和性别两个参数,我们的建议处理方法接收两个参数,分别是sex1和name1,我们希望切入点表达式中的名字参数是对应的建议处理方法的第二个参数,即name1,希望切入点表达式中的性参数是对应的建议处理方法的第一个参数,即sex1,那么我们在指定@Before注解的argNames参数时必须定义姓名和性别参数与建议处理方法参数的关系,且顺序要求与对应的处理方法的参数顺序一致,即哪个参数是需要与建议处理方法的第一个参数匹配则把哪个参数放第一位,与第二个参数匹配的则放第二位,在我们的这个示例中就应该是性放第一位,名字放第二位。

@Before (value=https://www.yisu.com/zixun/癰ean (userService) & & args(名字、性别)”argNames=靶员?姓名”)   公共空beforeWithParam3 (int sex1字符串name1) {   system . out。println(“性是:”+ sex1);   system . out。println(“名字是:“+ name1);   }

@Before注解的argNames参数不是必须的,它只有在我们编译的字节码中不含调试信息或切入点表达式中使用的参数名与建议处理方法的参数名不一致时才需要,所以在编译的字节码中包含调试信息且建议参数名与切入点表达式中使用的参数名一致时,我们完全可以把argNames参数省略。如果表达式里面使用了多个参数,那么这些参数在表达式中的顺序可以与建议方法对应参数的顺序不一致,例如下面这个样子。

建议如何利用Spring Aop进行传参