AOP de Spring
A continuación, se describen una serie de puntos claves del Framework de trabajo AOP de Spring:
1.- Todos los consejos que se crean en Spring se escriben en una clase estándar de Java. Los puntos de corte que definen dónde se aplica el consejo pueden especificarse con anotaciones o en XML en el archivo de configuración de Spring.
2.- Spring aconseja los objetos en tiempo de ejecución.
3.- Los aspectos de Spring se implementan como proxy que empaquetan el objeto de destino. El proxy gestiona las invocaciones de métodos, aplica lógica de aspectos adicional y, después, invoca el método de destino.
4.- Spring solo admite puntos de cruce de método. Es una diferencia con respecto a otros Framework de trabajo AOP, que proporcionan puntos de cruce de constructor y de campo además de los de método.
Definir puntos de corte
En la siguiente lista se indican los diferentes designadores que se pueden usar en AOP de Spring para definir puntos de corte:
args()
Limita las coincidencias del punto de cruce a la ejecución de aquellos métodos cuyos argumentos son instancias de los tipos dados.
@args()
Limita las coincidencias del
punto de cruce a la ejecución de aquellos métodos cuyos argumentos sed anotan con
los tipos de anotación proporcionados.
execution()
Hacer coincidir los puntos
de cruce que son ejecuciones de métodos.
this()
Limita las coincidencias de
puntos de cruce a aquellas en las que la referencia de bean del proxy AOP es de
un tipo determinado.
@target()
Limita las coincidencias de
puntos de cruce cuando la clase de un objeto en ejecución cuenta con una
anotación del tipo dado.
within()
Limita la coincidencia a los
puntos de cruce de ciertos tipos.
@within
Limita la coincidencia a los
puntos de cruce dentro de ciertos tipos que cuenten con la anotación dada.
@annotation
Limita las coincidencias de
puntos de cruce a aquellos en los que el asunto del punto de cruce cuenta con
la anotación dada.
DEFINIR UN ASPECTO
Para definir un aspecto se debe declarar una clase y anotarla con @Aspect. Dentro de la clase, los métodos se anotan con anotaciones de consejo para indicar cuándo deben invocarse.
A continuación, se indican las diferentes anotaciones para definir aspectos:
@After
El método de consejo se
invoca después de que el método aconsejado devuelva o genere una excepción.
@AfterReturning
El método de consejo se
invoca después de que el método aconsejado devuelva un resultado.
@AfterThrowing
El método de consejo se
invoca después de que el método aconsejado genere una excepción.
@Around
El método de consejo
encapsula al método aconsejado.
@Before
El método de consejo se
invoca antes de ejecutarse el método aconsejado
Ejemplo
Para ilustrar el uso de aspectos en Spring, se necesita un elemento que sea el sujeto de los puntos de corte del aspecto.
Para ello, se va a definir la clase Estudiante:
package com.sergio.memoria;
public class Estudiante {
public void realizarExamen() {
System.out.println(“Realizar examen.”);
}
}
Por otro lado, se va a definir la clase PadreEstudiante como aspecto que se aplica al estudiante.
package com.sergio.memoria;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import
org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class PadreEstudiante
{
@Before(“execution(* com.sergio.memoria.Estudiante.realizarExamen(..))”)
public void apuntarAcademia() {
System.out.println(“Apuntar al hijo a
una academia que lo prepare.”);
}
@AfterReturning(“execution(* com.sergio.memoria.Estudiante.realizarExamen(..))””)
public void falicitarHijo()
{
Sysment.out.println(“Felicitar al hijo por
la calificación obtenida.”);
}
@AfterThrowing(“execution(* com.sergio.memoria.Estudiante.realizarExamen(..))”)
public void
pedirHijoMayorEsfuerzo() {
System.out.println(“Pedir al hijo mayor
esfuerzo para el siguiente examen.”);
}
}
PadreEstudiante dispone de tres métodos que describen acciones que los padres de un estudiante pueden realizar a la hora de que sus hijos hagan un examen.
Antes del examen, el padre apunta al hijo a una academia que lo prepare para el mismo. Si en el examen se consigue una buena calificación, el padre al hijo por su resultado. Pero si no es así, el padre le debe pedir al hijo que se esfuerce más en el siguiente examen.
No hay comentarios:
Publicar un comentario