¿Para qué se usa normalmente Spring AOP (programación orientada a aspectos)?
Opciones
- Escribir las plantillas HTML de las vistas de una app
- Añadir logging o seguridad alrededor de métodos sin editarlos (Opción correcta)
- Compilar el proyecto más rápido con menos clases
- Guardar las sesiones de usuario entre dos peticiones
Respuesta
Añadir comportamiento transversal como logging, transacciones, seguridad o medición de tiempos alrededor de métodos sin cambiar su código, mediante proxies
Por qué
Algunas responsabilidades aparecen en muchos sitios (logging, transacciones, comprobaciones de seguridad, métricas). Copiar ese código en cada método ensucia la lógica.
AOP te permite definir un aspecto (advice) y dónde se aplica (pointcut). Spring lo implementa con proxies que envuelven tus beans: @Transactional, @Cacheable, @Async y la seguridad de métodos funcionan así.
Como se basa en proxies, las llamadas dentro de la misma clase no se interceptan (self-invocation).
@Aspect
@Component
public class TimingAspect {
@Around("execution(* com.acme.service..*(..))")
public Object time(ProceedingJoinPoint pjp) throws Throwable {
long t = System.nanoTime();
try { return pjp.proceed(); }
finally { System.out.println(pjp.getSignature() + " took " + (System.nanoTime() - t) / 1_000_000 + " ms"); }
}
}Recuerda
AOP = comportamiento reutilizable alrededor de métodos, implementado con proxies.