Я хочу отслеживать все общедоступные методы всех классов с указанной аннотацией (например, @Monitor) (примечание: аннотация находится на уровне класса). Что может быть для этого возможным? Примечание. Я использую Spring AOP в стиле @AspectJ.
java
aop
aspectj
spring-aop
Реджив Дивакаран
источник
источник
Ответы:
Вы должны комбинировать тип pointcut с методом pointcut.
Эти pointcuts выполнят работу по поиску всех общедоступных методов внутри класса, отмеченного аннотацией @Monitor:
Посоветуйте последний pointcut, который объединяет первые два, и готово!
Если вам интересно, я написал шпаргалку со стилем @AspectJ здесь с соответствующим примером документа здесь.
источник
Используя аннотации, как описано в вопросе.
Аннотация:
@Monitor
Аннотация на классе
app/PagesController.java
:Аннотация по методу
app/PagesController.java
:Аннотаций,
app/Monitor.java
:Аспект аннотации
app/MonitorAspect.java
:Включить AspectJ,
servlet-context.xml
:Включить библиотеки AspectJ,
pom.xml
:источник
Monitor
должна быть SpringComponent
?Component
Аннотаций используется , чтобы сообщить пружинный контейнер для применения включают класс в AspectJ ткач вещи. По умолчанию Spring просматривает толькоController
,Service
и другие конкретные аннотации, но неAspect
.@Component
аннотации@interface
не к файлуAspect
. Зачем это нужно?@Component
аннотации указано, что Spring скомпилирует его с аспектно-ориентированной системой AspectJ IoC / DI. Не знаю, как сказать по-другому. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Что-то такое:
Обратите внимание, что у вас не должно быть никаких других советов по тому же классу перед этим, потому что аннотации будут потеряны после проксирования.
источник
использование
источник
этого должно быть достаточно, чтобы пометить ваш метод аспекта следующим образом:
Взгляните на это, чтобы получить пошаговое руководство по этому поводу.
источник
Вы также можете определить pointcut как
источник
execution(public * @Monitor *.*(..))
Работает и попроще .Кажется, самый простой способ:
Он перехватит выполнение всех методов, специально помеченных @MyHandling в классе YourService. Чтобы перехватить все методы без исключения, просто поместите аннотацию прямо в класс.
Независимо от частной / общедоступной области, но имейте в виду, что spring-aop не может использовать аспект для вызовов методов в одном и том же экземпляре (обычно частные), потому что в этом случае он не использует прокси-класс.
Здесь мы используем совет @Around, но в основном это тот же синтаксис, что и @Before, @After или любой другой совет.
Кстати, аннотацию @MyHandling нужно настроить так:
источник
// perform actions after
Никогда не дозвонились , так как мы возвращаем значение в строке перед.Вы можете использовать Spring PerformanceMonitoringInterceptor и программно зарегистрировать совет с помощью постпроцессора beanpost.
источник
Из Spring's
AnnotationTransactionAspect
:источник