Я хочу контролировать, все открытые методы всех Классов с указанной аннотацией (скажите что @Monitor) (примечание: Аннотация на уровне класса). Каков мог быть возможный pointcut для этого?Примечание: Я использую AOP Spring стиля @AspectJ.
]Что-то вроде этого:[
] [@Before("execution(* com.yourpackage..*.*(..))")
public void monitor(JoinPoint jp) {
if (jp.getTarget().getClass().isAnnotationPresent(Monitor.class)) {
// perform the monitoring actions
}
}
]
[]Заметьте, что у вас не должно быть других советов по этому же классу []до [] этого, потому что аннотации будут потеряны после проксирования.[
].Вы должны комбинировать тип pointcut с методом pointcut.
Эти pointcut выполнят работу по поиску всех общедоступных методов внутри класса, отмеченного аннотацией @Monitor:
@Pointcut("within(@org.rejeev.Monitor *)")
public void beanAnnotatedWithMonitor() {}
@Pointcut("execution(public * *(..))")
public void publicMethod() {}
@Pointcut("publicMethod() && beanAnnotatedWithMonitor()")
public void publicMethodInsideAClassMarkedWithAtMonitor() {}
Посоветуйте последний pointcut, который объединяет первые два, и все готово!
Если вам интересно, я написал шпаргалку со стилем @AspectJ здесь с соответствующим примером документа здесь.