这是我第一次接触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/

10-10 03:38