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

  1. Before:  se aplica antes de que se invoque un método.
  2. After: se aplica después de que se invoque un método, sea cual sea el resultado.
  3. After-returning: se aplica después de que se retorne de un método con éxito. Se tiene acceso al retorno.
  4. After-throwing: se aplica después de que el método lance una excepción.
  5. 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

 

 

Made with Slides.com