Interceptores Con Spring
En Spring Framework podemos usar tags particulares de aop para interceptar objetos y declarar transacciones de manera mucho más simple.
Usando el mismo mecanismo, podemos interceptar objetos y agregarles cualquier tipo de comportamiento (más allá de transaccional).
Contenido
Ejmplo de creación de un interceptor
Existen distintos tipos de interceptores, que interceptan distintos aspectos (excepciones, antes de un método, después de un método, etc.).
Crear un interceptor de método es tan simple como hacer una clase que herede de org.aopalliance.intercept.MethodInterceptor
MethodInterceptor es el interceptor más amplio que existe, y muy facil de implementar.
Una clase interceptor de log de ejemplo
package com.dosideas.interceptor;
import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation;
public class LogInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("Iniciando llamada"); Object rval = invocation.proceed(); System.out.println("Finalizando llamada"); return rval; } }
Configuración del interceptor
Para agregar este interceptor a todo un grupo de clases podriamos configurar:
<aop:config> <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.business.*.*(..))"/> <aop:advisor advice-ref="interceptor.LogInterceptor" pointcut-ref="businessOperation"/> </aop:config>
<bean id="interceptor.LogInterceptor" class="com.dosideas.interceptor.LogInterceptor"/>
<bean id="business.PaisBo" class="com.dosideas.business.impl.PaisBoImpl"/>
Como vemos, declaramos un Pointcut que referencia a todas las clases y métodos del paquete business. Luego, declaramos un Advice, indicando que ese pointcut debe ser interceptado por LogInterceptor.
Y listo! Todos los objetos que declaremos y pertenezcan al paquete referenciado por el pointcut tendrán este interceptor.
Mejor aún, encadenar interceptores es tan simple como agregar advisor. Por ejemplo:
<aop:config> <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.demo.business.*.*(..))"/> <aop:advisor advice-ref="interceptor.!LogInterceptor" pointcut-ref="businessOperation"/> <aop:advisor advice-ref="interceptor.!FooInterceptor" pointcut-ref="businessOperation"/> <aop:advisor advice-ref="interceptor.!BarIntercetpor" pointcut-ref="businessOperation"/> </aop:config>
En este ejemplo, las clases serán interceptadas por LogInterceptor, luego FooInterceptor y finalmente BarInterceptor (y luego finalmente se ejecutará la clase real).
De la misma manera, se podría agregar un interceptor de transacciones (como vimos en la nota anterior) y otros interceptores.
La expresión del pointcut permite, como vemos, no sólo referenciar a clases, sino también a métodos particulares. Así, podremos interceptar ciertos métodos, ignorando otros.