1. Introducción
En este tutorial, presentaremos AOP (Programación Orientada a Aspectos) con Spring y comenzaremos a comprender cómo podemos comenzar a usar esta poderosa herramienta en escenarios prácticos.
También es posible aprovechar las anotaciones de AspectJ cuando se desarrolla usando Spring AOP, pero en este artículo, nos enfocamos en la configuración principal basada en Spring AOP XML.
2. Resumen
AOP es un paradigma de programación que tiene como objetivo aumentar la modularidad al permitir la separación de preocupaciones transversales. Lo hace agregando comportamiento adicional al código existente sin modificar el código en sí.
En cambio, podemos declarar este nuevo código y estos nuevos comportamientos por separado.
El marco AOP de Spring nos ayuda a implementar estas preocupaciones transversales.
3. Dependencias de Maven
Comencemos agregando la dependencia de la biblioteca AOP de Spring en el pom.xml :
org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE org.springframework.boot spring-boot-starter-aop
La última versión de la dependencia se puede consultar aquí.
4. Conceptos y terminología de AOP
Repasemos brevemente los conceptos y la terminología específicos de AOP:

4.1. Objeto comercial
Un objeto comercial es una clase normal que tiene una lógica comercial normal. Veamos un ejemplo simple de un objeto comercial en el que solo sumamos dos números:
public class SampleAdder { public int add(int a, int b) { return a + b; } }
Tenga en cuenta que esta clase es una clase normal con lógica empresarial y sin anotaciones relacionadas con Spring.
4.2. Aspecto
Un aspecto es la modularización de una preocupación que atraviesa múltiples clases. La tala unificada puede ser un ejemplo de tal preocupación transversal.
Veamos cómo definimos un Aspecto simple:
public class AdderAfterReturnAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); public void afterReturn(Object returnValue) throws Throwable { logger.info("value return was {}", returnValue); } }
En el ejemplo anterior, acabamos de definir una clase Java simple que tiene un método llamado afterReturn que toma un argumento de tipo Object y simplemente registra ese valor. Tenga en cuenta que incluso nuestro AdderAfterReturnAspect es una clase estándar, libre de anotaciones de Spring.
En las siguientes secciones, veremos cómo podemos conectar este aspecto a nuestro objeto comercial.
4.3. Joinpoint
Un Joinpoint es un punto durante la ejecución de un programa, como la ejecución de un método o el manejo de una excepción.
En Spring AOP, un JoinPoint siempre representa la ejecución de un método.
4.4. Pointcut
Un Pointcut es un predicado que ayuda a hacer coincidir un Consejo para ser aplicado por un Aspecto en un JoinPoint particular .
El Consejo suele estar asociado con una expresión de Pointcut y se ejecuta en cualquier Punto de unión que coincida con el Pointcut.
4.5. Consejo
Un consejo es una acción realizada por un aspecto en un Joinpoint en particular . Los diferentes tipos de consejos incluyen consejos "alrededor", "antes" y "después" .
En Spring, un Advice se modela como un interceptor, manteniendo una cadena de interceptores alrededor del Joinpoint .
4.6. Objeto y aspecto de negocio de cableado
Veamos cómo podemos conectar un objeto de negocio a un aspecto con un aviso posterior a la devolución.
A continuación se muestra el extracto de configuración que colocaríamos en una configuración estándar de Spring en la etiqueta "" :
Como puede verse, hemos definido un bean simple llamado simpleAdder que representa una instancia de un Business Object. Además, estamos creando una instancia de un aspecto llamado AdderAfterReturnAspect .
XML no es, por supuesto, nuestra única opción aquí; como se mencionó anteriormente, las anotaciones de AspectJ también son totalmente compatibles.
4.7. Configuración de un vistazo
La etiqueta aop: config se utiliza para definir la configuración relacionada con AOP. Dentro de la etiqueta de configuración , definimos la clase que representa un aspecto. Le hemos dado una referencia del bean de aspecto "doAfterReturningAspect" que creamos.
A continuación, definimos un Pointcut usando la etiqueta pointcut . Pointcut usado en el ejemplo anterior es ejecución (* org.baeldung.logger.SampleAdder +. * (..)) lo que significa aplicar un consejo sobre cualquier método dentro de la clase SampleAdder que acepta cualquier número de argumentos y devuelve cualquier tipo de valor.
A continuación, definimos qué consejo queremos aplicar. En el ejemplo anterior, aplicaremos un consejo posterior a la devolución que se define en nuestro Aspect AdderAfterReturnAspect mediante la ejecución del método denominado afterReturn definido mediante el método de atributo.
Este consejo dentro de Aspect toma un parámetro de tipo Objeto. El parámetro nos da la oportunidad de realizar una acción antes y / o después de la llamada al método de destino. En este caso, simplemente registramos el valor de retorno del método.
Spring AOP admite múltiples consejos utilizando una configuración basada en anotaciones; se pueden encontrar este y más ejemplos aquí y aquí.
5. Conclusión
En este tutorial, ilustramos los conceptos utilizados en AOP y un ejemplo del uso del módulo AOP de Spring. Si está interesado en descubrir más sobre AOP, aquí tiene algunos recursos:
- Una introducción a AspectJ
- Implementación de una anotación Spring AOP personalizada
- Introducción a las expresiones Pointcut en Spring
- Comparación de Spring AOP y AspectJ
- Introducción a los tipos de consejos en primavera
La implementación de estos ejemplos se puede encontrar en el proyecto GitHub; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar como está.