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> 
No hay comentarios.:
Publicar un comentario
Es bueno comunicarnos, comenta!!.