Diferencia entre revisiones de «Interceptores Con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Una clase interceptor de log de ejemplo)
(Ejmplo de creación de un interceptor)
 
(No se muestran 3 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
 +
[[Category:Spring Framework]]
 +
[[Categoría: AOP]]
 
En [[Spring Framework]] podemos usar tags particulares de aop para interceptar objetos y declarar transacciones de manera mucho más simple.
 
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).
 
Usando el mismo mecanismo, podemos interceptar objetos y agregarles cualquier tipo de comportamiento (más allá de transaccional).
  
== Ejmplo de creación de un interceptor ==
+
== Ejemplo 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.).
 
Existen distintos tipos de interceptores, que interceptan distintos aspectos (excepciones, antes de un método, después de un método, etc.).
  
Línea 11: Línea 13:
  
 
=== Una clase interceptor de log de ejemplo===
 
=== Una clase interceptor de log de ejemplo===
<pre>
+
<code java>
 
  package com.dosideas.interceptor;
 
  package com.dosideas.interceptor;
  
Línea 25: Línea 27:
 
     }
 
     }
 
  }
 
  }
</pre>
+
</code>
  
 
=== Configuración del interceptor ===
 
=== Configuración del interceptor ===
 
Para agregar este interceptor a todo un grupo de clases podriamos configurar:
 
Para agregar este interceptor a todo un grupo de clases podriamos configurar:
<pre>
+
<code xml>
 
  <aop:config>
 
  <aop:config>
 
     <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.business.*.*(..))"/>
 
     <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.business.*.*(..))"/>
Línea 39: Línea 41:
  
 
  <bean id="business.PaisBo" class="com.dosideas.business.impl.PaisBoImpl"/>
 
  <bean id="business.PaisBo" class="com.dosideas.business.impl.PaisBoImpl"/>
</pre>
+
</code>
  
 
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.
 
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.
Línea 46: Línea 48:
  
 
Mejor aún, encadenar interceptores es tan simple como agregar advisor. Por ejemplo:
 
Mejor aún, encadenar interceptores es tan simple como agregar advisor. Por ejemplo:
 
+
<code xml>
 
  <aop:config>
 
  <aop:config>
 
     <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.demo.business.*.*(..))"/>
 
     <aop:pointcut id="businessOperation"expression="execution(* com.dosideas.demo.business.*.*(..))"/>
Línea 53: Línea 55:
 
     <aop:advisor advice-ref="interceptor.!BarIntercetpor" pointcut-ref="businessOperation"/>
 
     <aop:advisor advice-ref="interceptor.!BarIntercetpor" pointcut-ref="businessOperation"/>
 
  </aop:config>
 
  </aop:config>
 +
</code>
  
 
En este ejemplo, las clases serán interceptadas por LogInterceptor, luego FooInterceptor y finalmente BarInterceptor (y luego finalmente se ejecutará la clase real).
 
En este ejemplo, las clases serán interceptadas por LogInterceptor, luego FooInterceptor y finalmente BarInterceptor (y luego finalmente se ejecutará la clase real).
Línea 59: Línea 62:
  
 
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.
 
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.
 
  
 
==Ver también==
 
==Ver también==
 
* [[Transacciones Con Spring]]
 
* [[Transacciones Con Spring]]
 
* [http://static.springframework.org/spring/docs/2.0.x/reference/aop.html Manual de Spring: Capítulo 6]
 
* [http://static.springframework.org/spring/docs/2.0.x/reference/aop.html Manual de Spring: Capítulo 6]

Revisión actual del 18:27 30 mar 2010

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).

Ejemplo 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.

Ver también