Лучше использовать AOP вместе с аннотациями. Тогда не будет неожиданностей. Вы всегда будете видеть, что метод аннотирован, значит подвергается препроцессингу со стороны AOP.
Наличие аннотации - маркер для AOP: "данный метод должен быть обработан".
Делаем аннотацию:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ActionMethod {
}
В applicationContext.xml добавляем (если ещё нет) список пакетов, к-е будут обрабатываться AOP
<context:component-scan base-package="a.b.c.d,a.bc.a">
<context:exclude-filter type="regex" expression=".*Test"/>
<context:exclude-filter type="regex" expression=".Test*"/>
</context:component-scan>
Подключаем в YourApplication-servlet.xml, указываем в каком пакете находятся классы, к-е будут обрабатываться AOP:
<context:component-scan base-package="a.b.c.server"/>
Создаём класс, реагирующий на вызовы целевых методов:
@Aspect
@Component
public class PerfLoggingAdvice {
private static final Logger perfLog = Logger.getLogger(ServerConst.PERF_LOG);
@Pointcut("execution(a.b.c.d.PageData<a.b.c.d.e.Entity> a.b.c.db.hibernate.SomeDataDB.get*(..)) || " +
"execution(* a.b.c.d.impl.Some.getList(..)) " )
public void somePoint() {}
@Around("somePoint()")
public Object someAction(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
if (isMethodAnnotated(joinPoint)) {
// code here will be executed before every method in package a.b.c.d with annotation @ActionMethod
} else {
result = joinPoint.proceed();
}
return result;
}
/**
* Returns true if the specified method (joinPoint) is annotated with
* {@link ActionMethod } annotation.
*
*/
private boolean isMethodAnnotated(ProceedingJoinPoint joinPoint) {
MethodSignature ms = (MethodSignature) joinPoint.getSignature();
Method mInterf = ms.getMethod();
try {
Method m = joinPoint.getTarget().getClass().getMethod(mInterf.getName(), mInterf.getParameterTypes());
return m.getAnnotation(ActionMethod.class) != null;
} catch (NoSuchMethodException e) {
return false;
}
}
}