D'un point de vues pratique, un Aspect appliqué à l'appel (call) nécessite de weaver toutes les classes faisant appel à la cible de l'aspect
et seules ces classes weavées bénéficieront de l'aspect (on peut donc décider que certaines ne doivent pas être weavées)
tandis qu'un Aspect appliqué à l'exécution nécessite de weaver seulement la classe qui contient la définition de la cible mais alors aussi toutes les exécutions auront
d'office l'aspect appliqué.
Dans des petits projets cela ne change pas grand chose, mais si vous faites des librairies utilisées par d'autres, ce choix détermine ce que vous devez livrer
et comme le "client" va l'intégrer dans son projet, ce qui nous amène à votre deuxième question :
vous pouvez livrer vos Aspects sous forme de JAR et les utiliser dans un autre projet (ou un autre module d'un même projet multi-modules)
Si vous utilisez Maven, cela implique d'utiliser le plug-in ,
dans le module contenant les Aspects:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${maven-aspectj-plugin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
<goal>aspectj-report</goal>
</goals>
<configuration>
<source>${java.version}</source>
<target>${jdk.version}</target>
<complianceLevel>${jdk.version}</complianceLevel>
<ajdtBuildDefFile>build.ajproperties</ajdtBuildDefFile>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<source>${java.version}</source>
<target>${jdk.version}</target>
<complianceLevel>${jdk.version}</complianceLevel>
<ajdtBuildDefFile>build.test.ajproperties</ajdtBuildDefFile>
</configuration>
</execution>
</executions>
<configuration>
<outxml>true</outxml>
<source>${java.version}</source>
<target>${jdk.version}</target>
<complianceLevel>${java.version}</complianceLevel>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj.version}</version>
</dependency>
</dependencies>
</plugin> |
les build.ajproperties et build.test.ajproperties contenant une simple ligne
src.includes=src/main/aspect
(éventuellement aussi si votre lib a besoin aussi de code .java)
et
src.includes=src/main/aspect,src/test/java
(les JUNIT sont forcément en Java)
et du côté du module/projet client de votre JAR contenant les aspects:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${maven-aspectj-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj.version}</version>
</dependency>
</dependencies>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<complianceLevel>${java.version}</complianceLevel>
<forceAjcCompile>true</forceAjcCompile>
<aspectLibraries>
<aspectLibrary>
<groupId>YOUR_GROUP_ID</groupId>
<artifactId>YOUR_ASPECT_LIB_ARTIFACT_ID</artifactId>
</aspectLibrary>
</aspectLibraries>
<verbose>false</verbose>
<showWeaveInfo>true</showWeaveInfo>
</configuration>
</plugin> |
et évidemment votre
YOUR_GROUP_ID/YOUR_ASPECT_LIB_ARTIFACT_ID
doit aussi être déclaré dans les du client.
Partager