El pueblo no debería temer al gobierno, el gobierno debería temer al pueblo
V, en V de Vendetta

Archivos del día 7 de July del 2008

Spring AOP : Primeros pasos

La Programación Orientada a Aspectos (POA en español, AOP en inglés) es un concepto relativamente antiguo, y que ha tenido un éxito relativamente discreto.

Proyecto holamundoAOPBásicamente consiste en implementar por un lado un aspecto, que es un trozo de código común a ejecutar en varios métodos / clases. Por otro lado configuraremos los puntos de cruce, que son los lugares en los que el aspecto cruza con el código, es decir, cuando serán ejecutados. Para que funcione debemos interponer un Proxy entre la clase y el aspecto. De esta forma podemos acoplar / desacoplar aspectos comunes sin tocar código.

Existen varias implementaciones como AspectJ (AspectJ Programming Guide) o Spring AOP (Aspect Oriented Programming in Java with Spring Framework), y desgraciadamente no he encontrado mucha documentación fiable y moderna al respecto, además de que la terminología ha evolucionado estos últimos años.

En esta entrada construiremos un aspecto muy sencillo para aplicarlo a todos los objetos de negocio. El aspecto auditará el tiempo que tarda en ejecutarse cualquier método de la capa de negocio.

holamundoAOP

Partiremos del anterior proyecto, holamundoBO. Creamos un nuevo proyecto web dinámico, holamundoAOP, e introducimos las librerías de Spring, la configuración en el web.xml, los jsps, las clases que hemos definido y configuramos holamundoAOP-servlet.xml. Comprobamos que funciona todo correctamente.

Implementación del aspecto

Ahora podemos implementar un aspecto, en nuestro ejemplo utilizaremos una clase es.lycka.holamundoAOP.aspectos.AuditoriaInterceptor.

package es.lycka.holamundoAOP.aspectos;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class AuditoriaInterceptor implements MethodInterceptor {

      public Object invoke(MethodInvocation method) throws Throwable {

            long start = System.currentTimeMillis();

            try {

                  Object result = method.proceed();

                  return result;

            }finally {

                  long end = System.currentTimeMillis();

                  long timeMs = end - start;

                  System.out.println("Method: " + method.toString() + " took: " + timeMs +"ms.");

            }

      }

}

Configuración de AOP

Primeros declaramos el bean que identifica al aspecto:

<bean name="auditoriaInterceptor" class="es.lycka.holamundoAOP.aspectos.AuditoriaInterceptor" />

Y ahora declaramos el proxy y lo configuramos para interceptar las llamadas a los métodos de negocio, que serán atendidas por nuestro aspecto.

<bean id="autoProxyCreator"         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

      <property name="interceptorNames">

            <value>auditoriaInterceptor</value>

      </property>

      <property name="beanNames">

            <value>*BO</value>

      </property>

</bean>

Reiniciamos, et voilá, ya lo tenemos. Volvemos a introducir el path "holamundoAOP/holamundo.lycka" y ahora el método es interceptado y el aspecto ejecutado. Simple y bello.