Spring AOP: аннотация по любому методу, который не работает x

Я начинаю работу с AOP в первый раз.

У меня есть первый аспект:

@Aspect
public class SyncLoggingAspect {
    private final Logger logger = Logger.getLogger(this.getClass());

    @Before("execution(public * *(..))")
    public void anyPublic() {
        System.out.println("HIT POINTCUT");
    }
}

Это успешно продолжается при вызове любого вызова метода, который является общедоступным. Однако, когда я изменяю его на это:

@Before("execution(public * doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}

Я бы ожидал, что он будет работать над любым общедоступным методом, называемым doPoll, но когда не будет вызван такой метод:

public class GmailContactPoller extends ContactPoller<GoogleUser, ContactPusher<GoogleUser>> {
    Logger logger = Logger.getLogger(this.getClass());

    @Override
    public List<? extends ContactPusher<GoogleUser>> doPoll() throws PollException {
           ...
    }
}

Есть ли что-то, что мне не хватает с синтаксисом EL? Или это как-то связано с иерархией наследования? Суперклассический метод doPoll является абстрактным в абстрактном классе Poller. Не возникает ли проблема с интерфейсом?

Изменить: я только заметил, что моя IDE включает в себя инструмент spring аспект, и теперь у меня есть следующее предупреждение компилятора с помощью метода:

"Описание Тип расположения пути ресурса совет, определенный в datasync.aop.aspects.SyncLoggingAspect не применяется [Xlint: adviceDidNotMatch] SyncLoggingAspect.java/DataSync/src/main/datasync/aop/аспекты "

Ответ 1

Spring AOP Прокси и аспектJ имели в основном некоторые отличия:

  • Spring АОП работает только с общедоступными методами.
  • Spring АОП не работает для самостоятельных вызовов.

Более подробную информацию вы можете найти разделы 8.4 и 8.5 из Spring Документация.

В настоящее время у вас есть два решения:

  • реорганизуйте свой код, чтобы удалить необходимость самостоятельного вызова
  • используйте AspectJ, а не Spring прокси AOP либо во время компиляции, либо время загрузки.

Ответ 2

Try:

@Before("execution(public * *.doPoll(..))")
public void anyPublic() {
    System.out.println("HIT POINTCUT");
}