Выполнение Spring AOP надкласса без @target - PullRequest
2 голосов
/ 01 декабря 2011

Рассмотрим следующую ситуацию:

class A() {
    void a();
}

@MyAnnotation
class B extends A {
    void b();
}

Я хочу посоветовать все методы всех классов, помеченных @MyAnnotation (т.е. B.a ()). Это довольно простая задача из-за возможности использования выражения @target pointcut. НО! в этом случае все бины в контейнере (даже неподходящие) будут проксифицированы, что недопустимо.

Теперь вопрос: возможно ли создать pointcut expressino без @target, но с тем же эффектом?

1 Ответ

1 голос
/ 11 декабря 2011

Вы можете использовать внутри, как это.

execution(* *(..)) && within(@MyAnnotation *)

см. https://stackoverflow.com/a/2522821/672586 и http://forum.springsource.org/showthread.php?28525-Difference-between-target-and-within-in-Spring-AOP для получения более подробной информации. Соответствующий раздел из сообщения на форуме, объясняющий разницу между целевым и целевым значением

Одно из различий между ними состоит в том, что @within () сопоставляется статически, требуя, чтобы у соответствующего типа аннотации было только сохранение CLASS. Принимая во внимание, что @target () сопоставляется во время выполнения, требуя того же самого для сохранения RUNTIME. Кроме этого, в контексте Spring нет разницы между точками соединения, выбранными двумя.

...