Spring AOP: аннотация для любого метода с именем x не работает - PullRequest
10 голосов
/ 03 февраля 2012

Я впервые начинаю с АОП.

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

@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 позволяет использовать инструменты с пружинным аспектом, и теперь у меня появляется следующее предупреждение компилятора по методу:

"Описание Тип пути к ресурсу Совет, определенный в datasync.aop.aspects.SyncLoggingAspect, не был применен

Ответы [ 2 ]

5 голосов
/ 06 февраля 2012

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

  • Spring AOP работает только с открытыми методами.
  • Spring AOP не работает для самостоятельных вызовов.*

    Для получения дополнительной информации см. разделы 8.4 и 8.5 документации Spring .

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

    1. рефакторингкод для устранения необходимости самостоятельного вызова
    2. используйте AspectJ вместо прокси Spring AOP во время компиляции или загрузки.
2 голосов
/ 03 февраля 2012

Попробуйте:

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