Hemos presentado los conceptos básicos de Spring y el principio de IoC; en esta sección, presentamos Spring AOP con un ejemplo simple.
Para nuestro ejemplo, utilizamos como ejemplo la Gestión de pedidos e implementamos el mismo aspecto de seguimiento con Spring AOP. Este aspecto rastreó la ejecución de la aplicación. Así como en los conceptos de redes y desarrollo web.
Un rastro de aspecto simple
Nuestro primer aspecto escrito con Spring AOP monitorea cada artículo ordenado mostrando un mensaje antes y después del método addItem como se define en la clase Order.
Definir este aspecto requiere que definamos un TraceInterceptor de clase Java (similar al consejo “alrededor”), y también definir un bean correspondiente en el archivo de definición de bean XML (normalmente applicationContext.xml). Aún en un archivo de definición de bean, se debe definir un pointcut y vincularlo al interceptor mediante un asesor. En Spring Framework, AOP está naturalmente integrado porque sigue el principio de IoC y se define consistentemente con el modelo de bean. Las dependencias de interceptor, pointcut y asesor se implementan exactamente como las dependencias de bean normales.
Para habilitar AOP, el programa debe usar una fábrica ApplicationContext (o una derivada). Es importante notar que la fábrica ApplicationContext devolverá un proxy AOP al acceder a un bean. Spring usa proxies J2SE para generar los proxies cuando es posible (cuando se define una interfaz para el bean) y proxies CGLIB en caso contrario. Cuando se llama a un método en un bean, es el proxy AOP el que llama automáticamente a los interceptores potencialmente instalados para este método.
Un simple pointcut
Los puntos de Spring AOP se definen en las entradas de definición de bean XML, pero también se pueden definir mediante programación (como verá más adelante en la sección “Pointcuts”). Una forma típica de definir un pointcut en XML es usar un conjunto de expresiones regulares (sintaxis de Perl 5). Cuando todas las expresiones regulares de un pointcut coinciden con el nombre del método (incluido su nombre de clase), significa que el método es un punto de unión que pertenece al pointcut.
Un ejemplo de configuración de Pointcut
Este código XML define un nuevo bean pointcut identificado por el ID de tracePointcut y la instancia de una clase RegexpMethodPointcut (que admite expresión regular). La propiedad de patrón de la línea 3 define una sola expresión regular que coincide con el método addItem de la clase Order.
Un interceptor simple
Con Spring AOP, una clase de interceptor debe implementar la interfaz org.aopalliance. MethodInterceptor y proporciona la implementación para el método de invocación, que define el código que se ejecutará antes y después de los puntos de unión.
La clase define el interceptor TraceInterceptor como se menciona en la definición de pointcut anterior:
package aop.spring; import org.aopalliance.MethodInterceptor; import org.aopalliance.MethodInvocation; public class TraceInterceptor implements MethodInterceptor { public Object invoke(Invocation invocation) throws Throwable { String methodName = invocation.getMethod().getName(); System.out.println("-> Before "+methodName); Object rsp = invocation.proceed(); System.out.println("-> After "+methodName); return rsp; }}
Spring AOP llama a la invocación del método justo antes de que se produzca un punto de unión. El único argumento de esta llamada contiene información sobre el punto de unión. El tipo de retorno corresponde al valor devuelto por el aspecto. Aquí, el interceptor muestra un primer mensaje, llama al método continuar, muestra un segundo mensaje y luego regresa. El método continue tiene la misma semántica que de costumbre: ejecuta el método recomendado (también método interceptado o método joinpoint).
Spring solo puede recomendar llamadas a métodos: el creador de Spring considera que la advertencia de campo es potencialmente dañina en el contexto de Spring, ya que viola los principios de encapsulación de beans.