Además de usando anotaciones, Spring permite utilizar la programación orientada a aspectos definiendo los elementos que intervienen en la misma a través de ficheros de configuración XML.
Cuando se trata de introducir una tecnología como la AOP es más sencillo empezar viendo ejemplos sencillos sobre el código fuente, y es por ello que se ha empezado viendo primero las anotaciones y ahora se expone la nomenclatura XML, en vez de al revés como se ha hecho con el resto de apartados vistos hasta ahora.
Schema
Para poder utilizar las etiquetas XML hay que incluir el namespace AOP de Spring:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> ... </beans>
Configuración
La configuración de la AOP en un fichero de configuración se declara dentro de bloques etiquetados con aop:config
, pudiendo existir tantos como se necesiten:
<aop:config> ... </aop:config>
Aspect
Un aspect se declara utilizando la etiqueta aop:aspect
y haciendo referencia a un bean:
<aop:config> <aop:aspect id="espia" ref="espia"/> </aop:config> <bean id="espia" class="com.empresa.espia"/>
Pointcut
Un pointcut se declara utilizando la etiqueta aop:pointcut
acompañada de una expresión regular:
<aop:aspect ref="espia"> <aop:pointcut id="anyConversacion" expression="execution(public * conversacion(..))"/> </aop:aspect>
Los pointcuts se pueden combinar utilizando «or», «and» y «not».
Advice
Un advice se declara utilizando la etiqueta correspondiente al tipo de ejecución deseada, junto con una expresión regular o una referencia a un pointcut, y el nombre del método con la implementación.
Con aop:before
se captura la llamada al método antes de que se produzca:
<aop:before pointcut-ref="anyConversacion" method="interceptar"/>
Con aop:after-returning
se captura la llamada al método cuando termina correctamente:
<aop:after-returning pointcut-ref="anyConversacion" returning="cotilleo" method="grabarConversacion"/>
Con aop:after-throwing
se captura la llamada al método cuando termina elevando una excepción:
<aop:after-throwing pointcut="execution(public * *(..))" throwing="gritito" method="grabarGrititos"/>
Con aop:after
se captura la llamada al método cuando termina normalmente o elevando una excepción:
<aop:after pointcut-ref="anyConversacion" method="interceptar"/>
Con aop:around
se puede reemplazar un método completo:
<aop:around pointcut-ref="anyConversacion" method="interceptar"/>
En todos los casos, las reglas que tienen que seguir los métodos definidos en las etiquetas son las mismas que las indicadas con el uso de anotaciones.