Implementación de AOP (Programación Orientada a Aspectos) en Spring Boot

AOP (Aspect-Oriented Prorgamming) se utiliza principalmente para registro de eventos, seguimiento, optimización y monitoreo de aplicaciones. A continuación se muestra un ejemplo práctico implementado con Spring Boot.

Dependencia Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Clase Aspecto para registro de peticiones HTTP

package com.ejemplo.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

@Aspect
@Component
public class RegistroAspecto {

    private static final Logger log = LoggerFactory.getLogger(RegistroAspecto.class);

    @Pointcut("execution(public * com.ejemplo.controlador.*.*(..))")
    public void puntoCorte() {
        // Punto de corte para todos los métodos públicos de los controladores
    }

    @Before("puntoCorte()")
    public void antes(JoinPoint punto) {
        log.info("======= ANTES de la ejecución del método =======");
        ServletRequestAttributes atributos = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (atributos != null) {
            HttpServletRequest peticion = atributos.getRequest();
            log.info("URL solicitada: {}", peticion.getRequestURL());
            log.info("Método HTTP: {}", peticion.getMethod());
            log.info("Dirección IP: {}", peticion.getRemoteAddr());
        }
        log.info("Clase y método: {}.{}", 
            punto.getSignature().getDeclaringTypeName(), 
            punto.getSignature().getName());
        log.info("Argumentos: {}", (Object[]) punto.getArgs());
        log.info("======= FIN de la información previa =======");
    }

    @After("puntoCorte()")
    public void despues() {
        log.info("======= DESPUÉS de la ejecución del método =======");
    }

    @AfterReturning(returning = "resultado", pointcut = "puntoCorte()")
    public void trasRetorno(Object resultado) {
        log.info("Respuesta devuelta: {}", resultado);
    }
}

Este aspecto intercepta todas las peticiones a los controladores del paquete com.ejemplo.controlador, registrando antes de la ejecución la URL, método HTTP, IP, clase/método y argumentos; después de la ejecución imprime un mensaje; y al final captura el valor de retorno.

La configuración básica para activar AOP en Spring Boot es automática al incluir la dependencia spring-boot-starter-aop. Solo es necesario anotar la clase con @Aspect y @Component.

Etiquetas: Spring AOP AspectJ Spring Boot Logging HTTP

Publicado el 9-12 10:59