La programación orientada a aspectos o, por sus siglas en inglés, AOP, es un paradigma que se complementa con la POO, ya que añade funcionalidades transversales sin tener que hacer modificaciones al código base. AOP en Spring es usada para hacer implementaciones como la gestión de transacciones, la seguridad y el logging sin invadir la lógica principal del programa. En el artículo de hoy queremos explicarte qué es la AOP en Spring y cómo puedes usarla de mejor modo.
¿Qué es AOP en Spring?
AOP en Spring nos permite añadir comportamientos adicionales a los métodos de las clases en una forma dinámica, sin tener que cambiar el código ya existente. Este procedimiento podemos hacerlo gracias a la creación de “aspectos” que funcionan por medio de bloques de código que contienen funcionalidades adicionales, como un sistema de login o la medición del tiempo de ejecución de determinado método.
Spring AOP funciona por medio de la creación de proxis dinámicos que actúan como intermediarios entre el código original y el nuevo comportamiento que se ha añadido. Esos proxis son ejecutados antes o después de la ejecución del método original, todo esto dependiendo de cómo hayan sido configurados.
Glosario de conceptos que debes entender con AOP en Spring
Para entender AOP en Spring, es importante familiarizarse con algunos términos, a saber:
- Aspecto: Un aspecto es la pieza central dentro de la programación orientada a aspectos. Este representa una funcionalidad adicional que se puede aplicar a múltiples puntos en un programa sin tener que alterar el código original. Por ejemplo, si necesitaras tener un registro del tiempo que se tardan en ejecutar determinados métodos, podrías generar un aspecto que tenga como función esta tarea.
- JoinPoint: Es un punto concreto durante la ejecución de los programas, por ejemplo durante la invocación de un método. Con el AOP en Spring los aspectos se aplican en estos puntos. V. gr., podrías definir que un aspecto se ejecute cada vez que se invoque un método en específico.
- PointCut: Este define exactamente en qué joinpoints se va a aplicar un aspecto. Puedes, por ejemplo, definir que tu aspecto de login solo sea aplicado a los métodos de una clase en particular o que se ejecute en todos los métodos que comiencen con “get”.
- Advice: Es un código que se ejecuta en algún JoinPoint seleccionado. Entre los tipos de Advice están Before, After, AfterReturning, AfterThrowing y Around. Todos ellos definen cuándo y cómo se ejecutará el código adicional en relación con el método original.
- Weaving: Este es un proceso mediante el que los aspectos se combinan con código del programa. En AOP en Spring esto se va haciendo en el tiempo de ejecución, mientras se utilizan proxies dinámicos.
¿Cómo funciona la programación orientada a aspectos en Spring?
Una de las mejores formas de entender cómo funcionan las cosas es por medio de ejemplos. Teniendo esto en mente, supongamos que tenemos una aplicación que utiliza Spring Boot y que tiene dos métodos en una clase de servicio:
@Service
public class MiServicio {
public void metodo1() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Método 1 ejecutado");
}
public void metodo2() {
System.out.println("Método 2 ejecutado");
}
}
Queremos añadir una funcionalidad que mida el tiempo de ejecución de estos métodos sin modificar el código de los métodos. Aquí es donde entra en juego AOP en Spring. Podemos crear un aspecto que mida el tiempo que tarda en ejecutarse cada método y lo registre en la consola:
@Aspect
@Component
public class TiempoAspecto {
@Around("execution(* com.ejemplo.servicios.*.*(..))")
public Object medirTiempo(ProceedingJoinPoint joinPoint) throws Throwable {
long inicio = System.currentTimeMillis();
Object resultado = joinPoint.proceed();
long fin = System.currentTimeMillis();
System.out.println("Tiempo transcurrido para " + joinPoint.getSignature() + ": " + (fin - inicio) + "ms");
return resultado;
}
}
En este caso el aspecto TiempoAspecto utiliza el tipo de Advice Around, que permite ejecutar código antes y después del método objetivo. El método proceed() es el encargado de ejecutar el método original. Luego, medimos el tiempo antes y después de la ejecución del método y lo mostramos en la consola.
Algunas formas de aplicar la AOP en Spring
El AOP en Spring puede llegar a sernos verdaderamente útil en algunos aspectos, como cuando tenemos que añadir funcionalidades que afectan a múltiples clases o métodos de manera transversal. Algunos de ellos incluyen:
- Gestión de transacciones: Definir aspectos que gestionen automáticamente las transacciones en determinados métodos.
- Auditoría y logging: Registrar la entrada y salida de datos en los métodos.
- Seguridad: Aplicar validaciones de seguridad en puntos clave de la aplicación.
- Control de rendimiento: Monitorizar el tiempo de respuesta de diferentes métodos.
Si te interesa seguir aprendiendo más sobre el AOP en Spring u otras herramientas de Java, te invitamos a unirte a nuestro bootcamp en Java, una forma fácil y rápida de incursionar en el mercado laboral con excelentes expectativas salariales. ¡No desperdicies tu tiempo en otros cursos, únete a nosotros y descubre la magia de la programación!