Что делает joinPoint.proceed ()? - PullRequest
2 голосов
/ 10 февраля 2020

Это мой первый подход к АОП. У меня есть приложение весенней загрузки с одним Аспектом, Logger. В поисках я пришел к выводу, что метод @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;
}

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Как вы сказали, когда вы используете @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- Вызов или вызов метода, который вы установили для него pointcut (proceed)

3- Сохраните журнал в базе данных или запишите его в файл или отправьте, ...

Пример авторизации

В этом примере, используя @Around, вы можете авторизовать пользователей и определить, могут ли они использовать метод или нет?

Так что вам нужно выполнить процесс авторизации до вызов метода, , если авторизация true, затем вызов метода , если не выдает исключение или вы можете войти.

1 - Авторизовать пользователя перед вызовом метода

2 - Если Авторизация была true, затем вызывать метод (joinPoint.proceed();)


В итоге , joinPoint.proceed(); означает, что вы вызываете метод set, или вызывая его.

1 голос
/ 10 февраля 2020

Как вы упомянули, совет @Around окружает точку соединения, например, вызов метода. Он может выполнять пользовательское поведение до и после вызова метода. Он также отвечает за выбор перехода к точке соединения или для быстрого запуска рекомендованного метода.

В вашем случае фактический вызов метода ( тех методов, которые содержат очень полезную бизнес-логику c! ) происходит из-за joinPoint.proceed();.

...