Wednesday, January 03, 2007

Midiendo tiempos con Spring AOP

No hay nada mas facil que integrar AOP (Aspect Oriented Programming) con Spring. De hecho, Spring fue diseñado no para proveer la mejor solucion en AOP sino una forma sencilla de integrar aspectos en nuestras aplicaciones.
En este ejemplo quiero mostrar como se puede armar una rutina que mida el tiempo consumido por cada metodo sin llenar nuestro codigo de System.currentTimeMillis().

El primer paso es armar nuestro around advice:
package com.miempresa.training.aop.advices;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class MiAOPTimer {
private static Log logger = LogFactory.getLog(MiAOPTimer.class);

@Around("execution(* com.miempresa.training..*.*(..))")
public Object cronometro(ProceedingJoinPoint pjp) throws Throwable{
long t1 = System.currentTimeMillis();
Object retorno = pjp.proceed();
long t2 = System.currentTimeMillis();
logger.info("Método: "+pjp.getSignature().getName()+" (" + (t2-t1) + " ms)");
return retorno;
}
}

Basicamente lo que hace es ejecutar el metodo "cronometro" para cada metodo, de cualquier clase, bajo el paquete com.miempresa.training.El nombre del metodo puede ser cualquiera, solo debemos tener en cuanta que debe tomar un ProceedingJoinPoint como parametro, retornar un objeto e invocar al metodo proceed sobre el parametro.

El archivo de configuracion de Spring debe definir el advice y el tag de autoproxies.
<beans>
<bean id="usuarioService" class="com.miempresa.training.aop.ServicioImpl"/>
<aop:aspectj-autoproxy/>
<bean id="miAOPTimer" class="com.miempresa.training.aop.advices.MiAOPTimer"/>
</beans>

No comments: