viernes, 5 de febrero de 2010

Creación de Aspectos con Spring y XML

En los dos post anteriores vimos como podemos crear aspectos mediante anotaciones y casi nada de xml más que un simple tag ahora vamos a seguir con los aspectos pero ya no con anotaciones sino con XML, los aspectos al no tener anotaciones que los configuren como aspectos toman al forma de simple java beans:

AuditoriaAspectXml.java
package pe.com.slcsccy.aop;
import pe.com.slcsccy.bean.Libro;
public class AuditoriaAspectXml {
public void auditar(Libro libroin, Object instancia) {
System.out.println("Aplicando Aspecto de auditoria auditar(..) @Before! con instancia:"+instancia.getClass().getCanonicalName());
}
}

ImpresorAspectXml.java
package pe.com.slcsccy.aop;
import pe.com.slcsccy.bean.Libro;
public class ImpresorAspectXml {
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());
}
}


La prueba de los aspectos se dispuso de tal forma que AuditoriaAspectXml.java se ejecute primero y antes del aspecto ImpresorAspectXml.java y que al final se ejecute la lógica de negocio.
Es decir el orden de ejecución debería ser el siguiente:

1. AuditoriaAspectXml.auditar();
2. ImpresorAspectXml.asignarAutor();
3. ImpresorService.imprimir()

La configuración mediante spring que logra lo anterior, es la siguiente:

<!-- Le indicamos a spring para que haga uso de las anotaciones @Autowired -->
<context:annotation-config/>
<!-- Le indicamos a spring que lea todas las clases bajo el paquete pe.com.slcsccy.service y sus
subpaquetes y clases, y si encuentra anotaciones estereotipadas(@Service,@Repository,@Controller)
a nivel de clase entonces cree beans del tipo singleton instanciandolas y disponiendolas al proyecto -->
<context:component-scan base-package="pe.com.slcsccy.service"/>
<!-- Creamos javabeans que nos servirá como aspecto -->
<bean id="impresorAspectXml" class="pe.com.slcsccy.aop.ImpresorAspectXml"/>
<bean id="auditoriaAspectXml" class="pe.com.slcsccy.aop.AuditoriaAspectXml"/>
<!-- Definición y configuración de los aspector propiamente dichos -->
<aop:config>
<!-- Configuración del primer aspecto de impresión y de orden=2, el atributo orden indica la secuencia
de ejecución de este aspecto cuando hay un advice que dispara varios aspectos, recuerda que un advice
es la clase en ejecución a la que le aplicamos los aspectos, en este proyecto es el
bean impresorService o instancias de la clase ImpresorServicePdf.java ó ImpresorServiceExcel.java-->
<aop:aspect ref="impresorAspectXml" order="2">
<!-- pointcut=literalmente punto de corte, indica a qué clase se le va a aplicar el aspecto, es
definido mediante expresiones regulares-->
<aop:pointcut id="pointcutImpresor"
expression="execution(public * pe.com.slcsccy.service..*(..)) and args(libroin) and target(instancia)"/>
<!-- aspecto, indica el nombre del método a ejecutar y el pointcut de referencia -->
<aop:before method="asignarAutor" pointcut-ref="pointcutImpresor" />
</aop:aspect>
<!-- Configuración del primer aspecto de impresión y de orden=1 -->
<aop:aspect ref="auditoriaAspectXml" order="1">
<aop:pointcut id="pointcutAuditoria"
expression="execution(public * pe.com.slcsccy.service..*(..)) and args(libroin) and target(instancia)" />
<aop:before method="auditar" pointcut-ref="pointcutAuditoria" />
</aop:aspect>
</aop:config>

El proyecto completo te lo puedes bajar desde AQUI:

No hay comentarios.:

Publicar un comentario

Es bueno comunicarnos, comenta!!.