Как работает это выражение pointcut выполнения? - PullRequest
0 голосов
/ 25 апреля 2020

Я наткнулся на ответ от @kriegaex, который я не в состоянии понять.

Выражение pointcut, которое я пытаюсь понять, выглядит следующим образом

@Around("execution(* (@MyAnnotation *).*(..)) || execution(@MyAnnotation * *(..))")

Как я понимаю, это выражение будет рекомендовать любой класс или метод, помеченный @MyAnnotation

Из справочной документации формат выражения execution выглядит следующим образом:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern)
            throws-pattern?)

Исходя из этого формата, следующее выражение

execution(* (@MyAnnotation *).*(..))

можно объяснить как

ret-type-pattern is * 
declaring-type-pattern is any type with @MyAnnotation
name-pattern is *
param-pattern is ..

, чтобы рекомендовать любой вызов метода в классе, помеченном @MyAnnotation. Пожалуйста, поправьте меня, если я ошибаюсь.

И для этого выражения

execution(@MyAnnotation * *(..))

Я не могу понять, как modifiers-pattern может быть @MyAnnotation? Как это работает?

1 Ответ

3 голосов
/ 27 апреля 2020

Это интересный вопрос. Кто-то читает документацию, вау! :)

Обслуживание документации является проблемой в AspectJ, потому что в настоящее время разработка - это в основном показ одного человека в исполнении Эндрю (Энди) Клемента. Он в основном занят работой с циклом выпуска Java и новыми языковыми функциями, например, уже существует версия для разработчиков с поддержкой Java 14 (классы записи).

Описание синтаксиса в Spring веб-сайт взят из Руководства по программированию AspectJ , на которое он также указывает. Хотя определение все еще действует, руководство по программированию было написано до эры Java 5, то есть долго a go, и IMO с тех пор не обновлялось. Вы можете заметить, что в нем даже не упоминаются аннотации.

Все, что связано с аннотациями, написано в так называемой записной книжке разработчика AspectJ 5 Development Kit , и там вы найдете небольшой абзац упоминание:

Каждая точка соединения имеет один набор модификаторов - к ним относятся стандартные модификаторы Java, такие как public, private, static, abstract et c ., любые аннотации и предложения throws методов и конструкторов. Эти модификаторы являются модификаторами субъекта точки соединения.

Так что для метода или класса AspectJ аннотации являются частью их группы модификаторов, как вы уже правильно заметили.


Обновление: Возможно, вы захотите подумать об инвестировании в книгу "AspectJ в действии" Раниваса Ладдада. Он также старый (2-е издание от 2009 г.), но охватывает основы AspectJ и Spring AOP solid. Вот скриншот, я надеюсь, что Рамнивас и / или издатель не предъявляют мне иск за это. Это должно быть стимулом для покупки книги:

Method and constructor signature patterns


Обновление 2: Выглядит так, как будто сейчас полную книгу можно даже читать онлайн бесплатно. Глава на скриншоте, например, здесь .

...