在Spring AOP中可以从相同的通知中获得返回值和方法参数吗?



在Spring AOP中是否可以从相同的通知中获得返回值和方法参数?

我正在尝试实现一些基于返回值和方法参数的登录。

所有这些信息都需要在通知中使用,以实现我的业务逻辑。

例如:

MyObject testMethod(String arg 1, String arg2){
..
..
return myObject;
}

在这种情况下,我需要myObject, arg1和arg2。

我尝试了下面的代码与两个不同的注释:@After和@AfterReturning如下所示:

@AfterReturning(value="execution(* com.example.aop.service.TestServiceImpl.printTestData(..))", returning="test")
public void checkSomethingAfter(JoinPoint joinPoint, Test test) {
System.out.println("------------AFTER RETURNING-----------");
System.out.println("After execution - 111 " + joinPoint.getArgs());
System.out.println("After execution - test: " + test);
System.out.println("-------------------------------------");
}
// @After(value = "execution(* com.example.aop.service.TestServiceImpl.printTestData(..)) and args()")
@After(value = "execution(* com.example.aop.service.TestServiceImpl.printTestData(..)) && args(id)")
public void afterAdvice(JoinPoint joinPoint, int id) {
System.out.println("After method:" + joinPoint.getSignature());
System.out.println("Creating Test with id - " + id);
}

问题是,我在@After中获得参数并在@Afterreturning中返回值。我的要求是在一个方法中同时获得返回值和参数。

我该怎么做?

这确实是可能的。您需要@Around建议,并从ProceedingJoinPoint中读取参数。


@Around("execution(* com.example.MyClass.testMethod(..))")
public Object testAop(ProceedingJoinPoint pjp) throws Throwable {
Object[] arguments = pjp.getArgs();
Object result = pjp.proceed();
// Do logic based on arguments + return value
return result;
}

我确实觉得实现可能会变得有点粗略,所以如果它不是一个真正的横切关注点,那么也许最好围绕这个方法编写你自己的委托。

也可以使用@AfterReturning注释。下面是一个例子。

假设我们在com.test.TestService类中有这个方法:

public Object test(String arg1, Integer arg2) { ... }

那么你的advice方法将看起来像这样:

@AfterReturning(
pointcut="execution(* com.test.TestService.test(..)) && args(arg1,arg2)",
argNames="arg1,arg2,returnedValue",
returning="returnedValue")
public void logAfterTest(String arg1, Integer arg2, Object returnedValue) {
// some logic
}

最新更新