вторник, 13 декабря 2011 г.

Как заюзать AOP

Лучше использовать 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;
       }
   }
}
 

Комментариев нет:

Отправить комментарий