Передать объект между двумя функциями Around — АОП

Я провожу аудит для своего уровня Controller, Service и Dao. У меня есть три функции Around для Controller, Service и Dao соответственно. Я использую пользовательскую аннотацию, которая, если она присутствует в методе контроллера, вызывает функцию аспекта вокруг. Внутри аннотации я установил свойство, которое я хочу передать из функции Controller Around в функцию Service around внутри класса Aspect.

public @interface Audit{
   String getType();
}

Я установлю значение этого getType из интерфейса.

@Around("execution(* com.abc.controller..*.*(..)) && @annotation(audit)")
public Object controllerAround(ProceedingJoinPoint pjp, Audit audit){
  //read value from getType property of Audit annotation and pass it to service around function
}

@Around("execution(* com.abc.service..*.*(..))")
public Object serviceAround(ProceedingJoinPoint pjp){
  // receive the getType property from Audit annotation and execute business logic
}

Как я могу передать объект между двумя функциями Around?


person Akash Raveendran    schedule 23.09.2016    source источник


Ответы (1)


Аспекты по умолчанию являются одноэлементными объектами. Однако существуют разные модели создания экземпляров, которые могут быть полезны в таких случаях использования, как ваш. Используя модель создания экземпляра percflow(pointcut), вы можете сохранить значение аннотации в своем контроллере вокруг совета и получить его в своем сервисе вокруг совета. Ниже приведен лишь пример того, как это будет выглядеть:

@Aspect("percflow(controllerPointcut())")
public class Aspect39653654 {

    private Audit currentAuditValue;

    @Pointcut("execution(* com.abc.controller..*.*(..))")
    private void controllerPointcut() {}

    @Around("controllerPointcut() && @annotation(audit)")
    public Object controllerAround(ProceedingJoinPoint pjp, Audit audit) throws Throwable {
        Audit previousAuditValue = this.currentAuditValue;
        this.currentAuditValue = audit;
        try {
            return pjp.proceed();
        } finally {
            this.currentAuditValue = previousAuditValue;
        }
    }

    @Around("execution(* com.abc.service..*.*(..))")
    public Object serviceAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("current audit value=" + currentAuditValue);
        return pjp.proceed();
    }

}
person Nándor Előd Fekete    schedule 23.09.2016
comment
Ответ правильный и описывает вариант червоточины. Проверьте ссылку, если вы хотите узнать, как вы можете реализовать то же самое с одноэлементным аспектом, используя cflow() pointcut, а не percflow() инстанцирование. Шаблон как таковой остается прежним, просто у вас будет меньше экземпляров аспектов. - person kriegaex; 25.09.2016
comment
@Nandor Elod Fekete - Спасибо, я узнал новую вещь, и ваше предложение сработало как шарм. - person Akash Raveendran; 26.09.2016