UNIDAD 5: Conceptos avanzados de Spring
eugeniaperez.es
eugeniaperez.es
5.1 Programación Orientada a Aspectos
La programación orientada a aspectos es una metodología que nos permite separar el código repetitivo y transversal del código principal.
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Este código se suele incorporar en clases que son "monitores".
Son similares a los triggers de BD o a los interceptores/eventos de Hibernate.
Definimos acciones que queremos realizar cuando se llame a un método de una clase determinada.
En el ejemplo, a continuación, simplemente mostramos mensajes por consola.
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.aspects del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.aspects.git
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Circuit (1:1) Race (1:N) Kart
El proyecto simula una carrera de coches. Una vez iniciada la carrera, los coches se mueven en función de unos parámetros aleatorios hasta que la terminan.
La idea es que antes de llamar a métodos o de que se retorne un valor, se llame a otro métodos de los Monitores de forma automática, para sacar los logs por consola.
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Desde el Main...
Se carga el contexto de Spring a través del fichero beans.xml
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Desde el beans.xml en src/main/resources creamos:
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Por lo tanto, debemos incluir el espacio de nombres AOP en el beans.xml y también:
<aop:aspectj-autoproxy>
<aop:include name="monitoringKart" />
<aop:include name="monitoringCircuit" />
</aop:aspectj-autoproxy>
Analicemos estas clases Monitores que se marcan como aspectos (@Aspect)
eugeniaperez.es
5.1 Programación Orientada a Aspectos
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Sintaxis de los joint-points:
execution(* hello(*))
execution(* hello(..))
execution(void hello*(String))
execution(void org.cuatrovientos.proyecto.Clase.*(..))
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Tipos de Advice
eugeniaperez.es
5.1 Programación Orientada a Aspectos
AfterThrowing
Se aplica en el caso de que se hayan lanzado excepciones. Es una buena manera de poder ejecutar código para común en caso de excepciones sin meter un catch en los métodos.
@AfterThrowing(value="execution(* org.sistema.Config.read(..))",throwing="ioException")
public void logIoException (JoinPoint joinPoint,
IOException ioException) {
String methodName = joinPoint.getSignature().toShortString();
Object fileName = joinPoint.getArgs()[0];
System.out.println("Error reading file: " + fileName );
}
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Around
Nos permite aplicar código antes y después de que se ejecute el método al que le aplicamos el aspecto:
@Around(value="execution(* org.sistema.spring.aspects.models.Kart.move(..))")
public void movingKart(JoinPoint joinPoint) {
// code executed before adviced method
System.out.println(“Before we move the kart”);
// ..
// Now we execute the method
jointPoint.proceed();
// code executed after adviced method
System.out.println(“Before we move the kart”);
// ..
}
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Finalmente, cada vez que se ejecute... Entre otros mensajes, visualizaremos los de los Monitores:
Kart moving
Kart.move() Kart Moving with join Point
Kart [name=SringKart_1, speed=6, acceleration=6, grip=6, position=0] Kart Moved: 13
SringKart_1 Kart handle: 9 (La maniobra es la suma del agarre y un nº aleatorio)
Circuit [name=Los Arcos, distance=167] Circuit difficulty: 3
eugeniaperez.es
5.2 Configuración de los logs: Spring log4j
Log4j es una biblioteca open source desarrollada por Apache Software Foundation, que permite a los desarrolladores de software elegir la salida y el nivel de los mensajes o “logs” en tiempo de ejecución.
Por defecto tiene 6 niveles de prioridad: trace, debug, info, warn, error, fatal. Además existen otros dos niveles extras (all y off).
eugeniaperez.es
5.2 Configuración de los logs: Spring log4j
Para configurar Log4j se debe incluir la dependencia en el pom.xml
Definir un log4j.properties o log4j.xml
Y crearlo como indica el fabricante:
Para utilizarlo:
Logger logger = Logger.getLogger(Main.class);
logger.info("Info message");
5.2 Configuración de los logs: Spring log4j
En el fichero log4j.properties o log4j.xml encontramos:
eugeniaperez.es
5.2 Configuración de los logs: Spring log4j
Configuración del visor Chainsaw, que permitirá visualizar los eventos capturados por log4j.
eugeniaperez.es
5.2 Configuración de los logs: Spring log4j
Desde Run As->Java Application,
elegimos el Main de Chainsaw.
Finalmente lanzamos nuestro
proyecto y veremos los eventos
registrados en función del nivel
de prioridad.
eugeniaperez.es
Descarga el código en Bitbucket
Descarga el proyecto spring.log4j del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/spring.log4j.git