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
相关产品推荐
相关产品推荐

