lunes, 1 de febrero de 2010

Creación de Aspectos con Spring y Anotaciones Parte 2

Ahora vamos a ver lo siguiente: como podemos ordenar la ejecución de los aspectos cuando estos aspectos se disparan ante el mismo advisor o método. En el post anterior definí un método imprimir de la interface ImpresorService, entonces, ¿qué es lo que pasa si tenemos más de un aspecto declarado ante la ejecución del método imprimir? ¿cuál aspecto se ejecuta primero?¿cómo podemos declarar que un aspecto se ejecute antes que otro?.

Veamos el siguiente requerimiento:
1. Agregar un proceso de auditoria que capture todas las ejecuciones del método imprimir

El requerimiento anterior lo podemos solucionar agregando un aspecto más y definir e implementar tanto la clase como el método de auditoria con la anotación @Order

Solución:
Declaración de componentes de spring:
<context:annotation-config/>
<context:component-scan base-package="pe.com.slcsccy.service"/>
<bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspect"/>
<bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspect"/>
<aop:aspectj-autoproxy/>

Implementación de componentes java:
AuditoriaAspect.java:
package pe.com.slcsccy.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import pe.com.slcsccy.bean.Libro;
@Order(1)
@Aspect
public class AuditoriaAspect {
@Order(1)
@Before("execution(public * pe.com.slcsccy.service..*(..)) && "+
"args(libroin) && target(instancia)")
public void auditar(Libro libroin, Object instancia) {
System.out.println("Aplicando Aspecto de auditoria auditar(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());
}
}

ImpresorAspect.java
package pe.com.slcsccy.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import pe.com.slcsccy.bean.Libro;
@Order(2)
@Aspect
public class ImpresorAspect {
@Order(2)
@Before("execution(public * pe.com.slcsccy.service..*(..)) && "+
"args(libroin) && target(instancia)")
public void asignarAutor(Libro libroin, Object instancia) {
if(libroin!=null)libroin.setAutor("Carlos Cacique");
System.out.println("Aplicando Aspecto asignarAutor(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());
}
}

Algunas acotaciones: La anotación @Order debe ser colocada tanto a nivel de clase como a nivel de método, si lo colocamos solo a nivel de método, entonces el orden de ejecución va a estar indicado por el orden en la carga de los beans:
<bean id="impresorAspect" class="pe.com.slcsccy.aop.ImpresorAspect"/>
<bean id="auditoriaAspect" class="pe.com.slcsccy.aop.AuditoriaAspect"/>

No hay comentarios.:

Publicar un comentario

Es bueno comunicarnos, comenta!!.