AOP高级用法——获取方法的参数和返回值

 我们平时在使用springAop的时候,经常是将某一个方法定义为一个切入点,用来做前置,后置或环绕增强,但如果想得到切入点方法的参数,以及它的返回值就需要做一些特定的配置。

 

普通的切面如下:

@Configuration
@Aspect
public class UserInfoAspect {
    @Pointcut("execution(* com.*.test(*))")
    public void test() {}
    @AfterReturning(value = "test()"")
    public void logMethodCall() throws Throwable {
        System.out.println("进入后置增强了!");
    }
}

 

获取切入点方法的参数:

@Configuration
@Aspect
public class UserInfoAspect {
    @Pointcut("execution(* com.*.test(*))")
    public void test() {}
    
    //使用JoinPoint 对象可以接收到切入点方法的参数
    @AfterReturning(value = "test()")
    public void logMethodCall(JoinPoint jp) throws Throwable {
        System.out.println("进入后置增强了!");
        String name = jp.getSignature().getName();
        System.out.println(name);
        Object[] args = jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:" + arg);
        }
    }
 }

由上可以看到,使用JoinPoint对象即可获取切点方法的参数值。

 

获取返回值的写法:

@Configuration
@Aspect
public class UserInfoAspect {
    @Pointcut("execution(* com.*.test(*))")
    public void test() {}
    
    //在事件通知类型中申明returning即可获取返回值
    @AfterReturning(value = "test()", returning="returnValue")
    public void logMethodCall(JoinPoint jp, Object returnValue) throws Throwable {
        System.out.println("进入后置增强了!");
        String name = jp.getSignature().getName();
        System.out.println(name);
        Object[] args = jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:" + arg);
        }
        System.out.println("方法返回值为:" + returnValue);
    }
}

由上可以看到,再申明事件通知的类型中申明"returing=returnValue",而后再切面的方法中引入 “Object returnValue”即可获取返回值。

 

    如果你想同时拥有多个切入点的话,可以使用逻辑操作符 “&&”,“||”等,如下所示:

@Pointcut("execution(* com.*.(*))")
public void addUser() {}
   
@Pointcut("execution(* com.*.(*))")
public void updateUser() {}
@After(value = "addUser() || updateUser()", returning="returnValue")
public void pushAccountInfo(JoinPoint jp, Object returnValue){
    //这里写切面逻辑:
}

这里需要注意的是逻辑操作符的使用,容易让人混淆的是 “&&”与”||" 的区别,如果你想一个切面能同时对多个切入点生效,应该使用的是“||”,而不是“&&”。

 

        今天的文章就到这里了,感谢亲爱的小伙伴们的欣赏与阅读。祝大家“六一儿童节快乐!”。

         更过赶货,请关注微信公众平台《Java深度编程》:

  • 12
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
AOP(面向切面编程)是一种编程范式,它通过在程序运行过程中的特定位置(切点)将额外的功能(加强方法)添加到应用程序中。 切点是程序执行过程中的一个特定位置。在AOP中,我们可以通过定义切点来确定在何处插入额外的功能。切点可以是方法的执行、异常的抛出、字段的访问等。通过使用切点,我们可以精确定位到在应用程序执行期间需要被增强的位置。 获取加强方法参数是指在切面中获取到被增强的方法参数。在AOP中,我们可以通过在切面中定义一个参数列表来获取被增强方法参数。这样我们就可以在程序执行时获取到这些参数,并进行相应的操作。 例如,假设我们有一个切点是程序中的一个方法,而这个方法有一个参数name。我们可以在切面中定义一个参数列表,将这个name参数作为切面的参数之一。然后在执行程序时,我们可以通过访问切面的参数列表获取到这个name参数。 通过获取加强方法参数,我们可以在AOP中实现一些有用的功能,比如记录日志、进行权限控制、性能监控等。通过在切面中获取方法参数,我们可以根据具体的需求来对这些参数进行处理,从而达到对应的功能目的。 总之,AOP切点获取加强方法参数是指在AOP编程中,通过定义切点来精确定位到需要被增强的位置,并通过切面中定义的参数列表获取到被增强方法参数,以实现对参数的操作和处理。这样能够给应用程序增加额外的功能,并提高程序的灵活性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值