Pointcut для перегруженных методов - PullRequest
0 голосов
/ 29 мая 2018

Если у нас перегружены методы с вложенными вызовами, как показано ниже

public void sample(int a) {
    sample(a, 5);
}

public void sample(int a, int offset) {
    System.out.println(a + offset);
}

Существует указатель и совет, как показано ниже

@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}


@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
        System.out.println("Advice called");
    }

Теперь, если вызывается sample (10), яполучить "Advice call" дважды в качестве вывода.Означает ли это, что poincut перехватывает оба перегруженных метода?

Но рассмотрим случай, когда метод не перегружен, как показано ниже.Теперь он выводит «Advice call» только один раз, даже если оба метода соответствуют выражению pointcut

public void sample(int a) {
    sampleWithOffset(a, 5);
}

public void sampleWithOffset(int a, int offset) {
    System.out.println(a + offset);
}

@Pointcut("execution(public * sample*(..))")
public void sampleMethod() {}


@Around("sampleMethod()")
public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
        System.out.println("Advice called");
    } 

1 Ответ

0 голосов
/ 31 мая 2018

Прежде всего, ваш @Around аспект не компилируется, потому что он не возвращает результат.Возможно, вы забыли скопировать что-то вроде return jp.proceed(); из вашего кода.

Теперь, если вызывается sample (10), я получаю дважды «Advice call» в качестве вывода.Означает ли это, что poincut перехватывает оба перегруженных метода?

Конечно, потому что ваш pointcut совпадает с именами обоих методов.Если вам нужно другое поведение, измените ваш pointcut.

Но рассмотрите случай, когда метод не перегружен, как показано ниже.Теперь он выводит «Advice call» только один раз, даже если оба метода соответствуют выражению pointcut

Ваше утверждение неверно.Аспект также печатается дважды.Вот доказательство:

Приложение драйвера:

package de.scrum_master.app;

public class Application {
  public void sample(int a) {
    sample(a, 5);
    sampleWithOffset(a, 9);
  }

  public void sample(int a, int offset) {
    System.out.println(a + offset);
  }

  public void sampleWithOffset(int a, int offset) {
    System.out.println(a + offset);
  }

  public static void main(String[] args) {
    new Application().sample(11);
  }
}

Формат:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class MyAspect {
  @Pointcut("execution(public * sample*(..))")
  public void sampleMethod() {}

  @Around("sampleMethod()")
  public Object storeMetrics(final ProceedingJoinPoint jp) throws Throwable {
    System.out.println(jp);
    return jp.proceed();
  }
}

Журнал консоли:

execution(void de.scrum_master.app.Application.sample(int))
execution(void de.scrum_master.app.Application.sample(int, int))
16
execution(void de.scrum_master.app.Application.sampleWithOffset(int, int))
20
...