2010-06-22 6 views
4

J'expérimente avec AspectJ Load-time Weaving au printemps comme décrit here. J'ai vérifié le sample code, et cela fonctionne comme annoncé.AspectJ Temps de chargement au printemps avec des coupes de points d'appel de méthode?

Mais lorsque j'essaie de changer le pointcut de la sémantique de execution(..) à call(..), le conseil n'est plus exécuté.

Je sais que Spring AOP ne prend pas en charge la sémantique call(..), mais cela ne devrait pas s'appliquer ici puisque j'utilise AspectJ LTW (l'exemple de code fonctionne avec succès avec des objets non gérés par Spring).

Quelqu'un peut-il apporter de la lumière?

Mise à jour: Afin de confirmer que fonctionne LTW, j'ai ajouté les propriétés système suivantes à la configuration argline dans pom.xml:

  • -Dorg.aspectj.weaver.showWeaveInfo=true
  • -Daj.weaving.verbose=true
  • -Dorg.aspectj.tracing.enabled=true
  • -Dorg.aspectj.tracing.factory=default
  • -Dorg.aspectj.tracing.file=/tmp/aspectj-trace.txt

Maintenant, la sortie en cours d'exécution mvn test contient les lignes suivantes:.

[AppClassLoader] info AspectJ Weaver Version 1.5.3 built on Wednesday Nov 22, 2006 at 11:18:15 GMT 
[AppClassLoader] info register classloader [email protected] 
[AppClassLoader] info using configuration 
    /private/tmp/aspectj-load-time-weaving/target/test-classes/META-INF/aop.xml 
[AppClassLoader] info register aspect org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice 
[AppClassLoader] weaveinfo Join point 
    'method-execution(void org.springbyexample.aspectjLoadTimeWeaving.Processor.process())' 
    in Type 'org.springbyexample.aspectjLoadTimeWeaving.Processor' (Processor.java:38) 
    advised by around advice from 
    'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java) 
[AppClassLoader] weaveinfo Join point 
    'method-execution(void org.springbyexample.aspectjLoadTimeWeaving. 
     PerformanceAdvice.aspectjLoadTimeWeavingExamples())' 
    in Type 'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java:37) 
    advised by around advice from 
    'org.springbyexample.aspectjLoadTimeWeaving.PerformanceAdvice' (PerformanceAdvice.java) 

Il semble donc que AspectJ a repris le PerformanceAdvice et a trouvé 2 points de jonction pour tisser dans Mais si je remplace execution(..) avec call(..) dans le point de jointure de PerformanceAdvice et exécutez à nouveau maven, la sortie ne contient pas ces 2 dernières lignes et le conseil n'est pas exécuté. La trace AspectJ contient beaucoup d'instructions de journal, mais je ne pouvais pas faire grand-chose. Je l'ai scanné pour des erreurs ou des avertissements, mais n'en ai trouvé aucun.

(je suppose que je devrais être en mesure de remplacer simplement execution(..) avec call(..), parce que leur syntaxe est décrite comme execution(MethodPattern) et call(MethodPattern) respectivement dans le AspectJ programming guide).

J'ai également essayé d'utiliser une version plus récente d'AspectJ (1.6.6), mais en vain.

Répondre

0

Utilisez-vous l'agent aspectJ actuel? Comme passer à votre JRE lors de l'exécution

-javaagent:lib/aspectjweaver.jar 

J'ai trouvé que c'était la seule façon que j'ai pu obtenir AspectJ AOP plutôt que le printemps AOP

+0

Oui, l'agent est configuré dans le POM Maven (voir ci-dessous). Comme je peux conseiller avec succès des objets non gérés par Spring, AspectJ semble fonctionner. http://svn.springbyexample.org/core/aspectj-load-time-weaving/tags/1.0/pom.xml –

2

Le désignateur d'appel devrait fonctionner avec votre pointcut.

Votre classe d'appel est-elle dans le package spécifié dans l'élément weaver?

<weaver> 
     <!-- only weave classes in this package --> 
     <include within="org.springbyexample.aspectjLoadTimeWeaving.*" /> 
</weaver> 

Si la classe d'appel et l'exécution est dans des emballages différents et il fonctionne avec l'exécution, puis fixer le fichier aop.xml ou factoriser votre classe d'appel pour être dans le paquet donné.

+0

Merci pour votre commentaire. J'ai vérifié deux fois qu'AspectJ entrait réellement, et a mis à jour ma question en conséquence. –

+0

La classe (test) qui appelle Processor.process() dans ce package: 'org.springbyexample.aspectjLoadTimeWeaving'? – Espen

+0

Oui, consultez l'URL ci-dessous pour le code source. Et si ce n'était pas le cas, je suppose qu'AspectJ ne fonctionnerait pas non plus avec "exécution". http://svn.springbyexample.org/core/aspectj-load-time-weaving/tags/1.0/src/test/java/org/springbyexample/aspectjLoadTimeWeaving/ProcessorTest.java –