You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring AOP同一Advice中能否同时获取方法返回值与入参

解决方案

你不需要同时使用@After和@AfterReturning两个通知,@AfterReturning本身就支持同时获取方法入参和返回值,具体实现方式如下:

方式1:直接获取所有入参

通过JoinPoint.getArgs()可以直接拿到目标方法的所有入参数组,不需要额外配置切点参数绑定:

@AfterReturning(value="execution(* com.example.aop.service.TestServiceImpl.printTestData(..))", returning="test")
public void checkSomethingAfter(JoinPoint joinPoint, Test test) {
    // 获取所有入参数组
    Object[] args = joinPoint.getArgs();
    // 确定入参类型后可强转获取对应参数,比如第一个参数是int类型的id
    int id = (int) args[0];
    
    System.out.println("------------AFTER RETURNING-----------");
    System.out.println("入参id: " + id);
    System.out.println("返回值test: " + test);
    System.out.println("-------------------------------------");
}

方式2:绑定指定入参(类型安全)

如果需要类型安全的获取指定入参,可以在切点表达式中通过args绑定参数名,同时和返回值参数一起声明在通知方法的入参中即可:

// 切点中同时指定execution规则、args参数绑定、returning返回值绑定
@AfterReturning(
    value = "execution(* com.example.aop.service.TestServiceImpl.printTestData(..)) && args(id)",
    returning = "test"
)
public void checkSomethingAfter(JoinPoint joinPoint, int id, Test test) {
    System.out.println("------------AFTER RETURNING-----------");
    System.out.println("入参id: " + id);
    System.out.println("返回值test: " + test);
    System.out.println("-------------------------------------");
}

多参数绑定示例

针对你举例的MyObject testMethod(String arg1, String arg2)方法,多个入参绑定的实现如下:

@AfterReturning(
    value = "execution(* com.example.xxx.xxx.testMethod(..)) && args(arg1, arg2)",
    returning = "myObject"
)
public void handleTestMethod(JoinPoint joinPoint, String arg1, String arg2, MyObject myObject) {
    // 这里可以直接拿到arg1、arg2和返回值myObject执行业务逻辑
}

注意事项

  • 通知方法的入参顺序没有强制要求,但要保证args绑定的参数名、returning指定的参数名和方法入参名完全一致
  • 只有方法正常执行完成后才会触发@AfterReturning通知,如果方法抛出异常则不会执行,符合你基于正常返回值处理业务的需求

内容的提问来源于stack exchange,提问作者Swapnil Hadge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:09:03