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.