Лучше использовать AOP вместе с аннотациями. Тогда не будет неожиданностей. Вы всегда будете видеть, что метод аннотирован, значит подвергается препроцессингу со стороны AOP.
Наличие аннотации - маркер для AOP: "данный метод должен быть обработан".
В applicationContext.xml добавляем (если ещё нет) список пакетов, к-е будут обрабатываться AOP
Подключаем в YourApplication-servlet.xml, указываем в каком пакете находятся классы, к-е будут обрабатываться 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; } } }
Комментариев нет:
Отправить комментарий