Maven-Spring-Aspectos con @Configurable y Weaving

Porqué la mayoría de la gente usa Load Time Weaving (LTW)? Esto requiere reemplazar el javaagent/classloader para tu JVM el cual batalla con el ordenamiento de todas las cosas.

Echemos un vistazo usando mejor el Compile Time Weaving (CTW).

Este ejemplo usa Spring 2.5.2, AspectJ 1.5.4, Java 1.5 (Spring 2.5.4 usa una version posterior de weaver (3.0 contra 5.0) - Asumo que AspectJ 1.6.0 pero el aspectj-mave-plugin está también basado alrededor de la versión 1.5.4, así que por ahora trabajemos con esta combinación.

En Spring, podemos simplemente inyectar recursos a beans normales de Spring, incluso vía la configuración del contexto de Spring, o usando el soporte para anotaciones basadas en inyecciones ((@Resource, @Autowired junto con @Repository, @Service etc).

Sin embargo, beans que son de alcance prototipo (scope="prototype") son más difíciles de manejar. Estas son renovadas (Bean foo = new FooBean();) incluso por el desarrollador o por frameworks externos o (Hibernate para beans del modelo, contenedores de servlet, etc.).

El sitio spring framework provee la anotación @Configurable para esto.

Cualquier bean que es anotado con @Configurable será inyectado con sus propiedades utilizando aspectos. Entonces necesitamos que las cosas estén preparadas para que este aspecto se ejecute.

Lo primero - el contexto de Spring.

Necesitas los siguiente en el contexto de tu aplicación:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:component-scan base-package="tu.paquete.raiz"/>
    <context:spring-configured/>
    <!-- mas beans  ... -->
</beans>

Recuerda agregar el context namespace a la declaracion de esquemas en tu archivo de contexto.

Ahora la configuracion de Maven

Necesitarás usar aspectj-maven-plugin desde el proyecto codehaus MOJO.


<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>aspectj-maven-plugin</artifactId>
  <configuration>
      <complianceLevel>1.5</complianceLevel>
        <aspectLibraries>
         <aspectLibrary>
             <groupId>org.springframework</groupId>
             <artifactId>spring-aspects</artifactId>
         </aspectLibrary>
        </aspectLibraries>
  </configuration>
  <executions>
      <execution>
         <goals>
              <goal>compile</goal>
          </goals>
        </execution>
  </executions>
</plugin>

Estos jars de la lista de librerias de aspectos deberían contener aspectos pre-compilados (en este caso las de Spring) y estos aspectos serán enlazados en tiempo de compilación contra el tiempo de compilación del código.

Artículo original de

http://micro-howto.blogspot.com