M4-UF1 FRAMEWORK SPRING
UNIDAD 5: Conceptos avanzados de Spring
eugeniaperez.es
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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.
- Frecuentemente necesitamos mostrar mensajes de log...
- O que cada vez que se realicen determinadas operaciones se haga alguna comprobación (permisos de acceso, etc...)
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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.
unidad 5: CONCEPTOS AVANZADOS SPRING
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
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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.
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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
- Se obtiene una instancia de la carrera (Race)
- Se inicia la carrera (race.run())
- Se muestra un resultado (race.showResult())
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Desde el beans.xml en src/main/resources creamos:
- 4 objetos de la clase Kart
- 1 objeto de la clase Circuit
- 1 objeto de la clase Race. A su vez, a este objeto le asigna los anteriormente creados (karts y circuit).
- 1 objeto de cada tipo de monitor (MonitoringKart y MonitoringCircuit).
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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)
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
eugeniaperez.es
5.1 Programación Orientada a Aspectos
- Join Point: punto de ejecución de código. Es decir un momento de la ejecución de código donde podemos aplicar un aspecto.
- Advice , indica el momento en el que ejecutar el código definido en el aspecto.
- Aspect: una clase java que integra el código a ejecutar. La de nuestro ejemplo anterior es marcada como @Aspect.
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Sintaxis de los joint-points:
- Nombre de método hello, cualquier parámetro y retorno:
- Nombre de método hello, SIN parámetros
- Nombre comienza por hello, parámetro String, retorno vacío
- Cualquier método void de la clase sin parámetros
execution(* hello(*))
execution(* hello(..))
execution(void hello*(String))
execution(void org.cuatrovientos.proyecto.Clase.*(..))
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
eugeniaperez.es
5.1 Programación Orientada a Aspectos
Tipos de Advice
- Before: se aplica antes de que se invoque un método.
- After: se aplica después de que se invoque un método, sea cual sea el resultado.
- After-returning: se aplica después de que se retorne de un método con éxito. Se tiene acceso al retorno.
- After-throwing: se aplica después de que el método lance una excepción.
- Around: se añade funcionalidad que se ejecuta antes y después de la ejecución del propio método.
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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 );
}
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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”);
// ..
}
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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).
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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");
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
5.2 Configuración de los logs: Spring log4j
En el fichero log4j.properties o log4j.xml encontramos:
- Se fija el nivel de log en INFO -> sólo se loguearán los mensajes de ese nivel y superiores.
- Se especifica que se volcará en dos medios: file y stdout.
- Se crea un appender para file que será incremental.
- Tamaño máximo de 2MB. En ese momento se creará un nuevo fichero.
- También se configura el formato de los logs.
- Se crea un segundo appender consistente en la consola de ejecución.
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
eugeniaperez.es
5.2 Configuración de los logs: Spring log4j
Configuración del visor Chainsaw, que permitirá visualizar los eventos capturados por log4j.
- En el properties añadimos CHAINSAW_CLIENT.
- # Config chainsaw. To test this, run org.apache.log4j.chainsaw.Main in this project
log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender
log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost
log4j.appender.CHAINSAW_CLIENT.Port=4445
log4j.appender.CHAINSAW_CLIENT.LocationInfo=true
UNIDAD 5: CONCEPTOS AVANZADOS SPRING
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.
unidad 5: CONCEPTOS AVANZADOS SPRING
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
Unidad 5
By eugenia_perez
Unidad 5
- 1,207