这是我第一次接触AOP。我有一个带有一个Aspect(一个记录器)的spring-boot应用程序。搜索我得出的结论是@Around方法在该方法之前和之后执行(我只是在一个方法中调用它),对吗?
在我的@Around方法中间,有一个joinPoint.proceed()
。如果我没有记错,那么JoinPoint
是我必须用来获取要调用方面的方法的信息的对象,但是我无法理解该过程实际在做什么!
这是我的代码:
@Around(value = "execution(* *(..)) && @annotation(Loggable)", argNames = "ProceedingJoinPoint, Loggable")
public Object logAround(ProceedingJoinPoint joinPoint, Loggable loggable) throws Throwable {
String methodArguments = loggable.printMethodArguments() ? Arrays.toString(joinPoint.getArgs()) : "[]";
long start = System.currentTimeMillis();
Object returnObject = joinPoint.proceed(); // continue on the
// intercepted method
long elapsedTime = System.currentTimeMillis() - start;
String returnValue = loggable.printReturn() && returnObject != null ? returnObject.toString() : "[]";
LOG.info("Logging method: {}.{} Method arguments: {}. Method return value: {}. Method execution time: {}",
joinPoint.getTarget().getClass().getName(), joinPoint.getSignature().getName(), methodArguments,
returnValue, elapsedTime);
return returnObject;
}
最佳答案
就像您说的那样,当您使用@Around
时,就像您可以在方法之前做任何想要的,然后调用方法一样,然后您可以在调用方法之后做任何您想做的事情。
调用阶段由//Read file, Log , .... (Before method calling)
//Invoke the method (joinPoint.proceed)
//Write to the file, complete log, .... (After method calling)
joinPoint.proceed()
完成。
日志示例
1-调用方法前登录
2-调用或调用您在其上设置切入点的方法(proceed
)
3-将日志保存到数据库中或将其写入文件或发送,...
授权示例
在此示例中,您可以使用@Around
授权用户并确定他们可以使用该方法吗?
因此,您需要在方法调用之前进行授权过程,如果授权为true
,则需要进行,如果没有引发异常,则可以调用方法或可以登录。
1-在调用方法之前授权用户
2-如果授权是true
,则调用方法(joinPoint.proceed();
)
总之,joinPoint.proceed();
表示您正在调用set方法或正在调用set方法。
关于java - joinPoint.proceed()有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60155769/