here で説明されているように、Spring で AspectJ Load-time Weaving を試しています。サンプル コードを確認しましたが、宣伝どおりに動作します。
しかし、PerformanceAdviceのポイントカットexecution(..)
をcall(..)
セマンティクスに変更しようとすると、アドバイスが実行されなくなります。
Spring AOP がセマンティクスをサポートしていないことはわかってcall(..)
いますが、AspectJ LTW を使用しているため、ここでは当てはまりません (サンプル コードは、Spring で管理されていないオブジェクトで正常に動作します)。
誰でも光を当てることができますか?
更新: LTW が機能することを確認するために、次のシステム プロパティを pom.xml の argline 構成に追加しました。
-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
現在、running の出力にmvn test
は次の行が含まれています。
[AppClassLoader] info AspectJ Weaver Version 1.5.3 built on Wednesday Nov 22, 2006 at 11:18:15 GMT
[AppClassLoader] info register classloader sun.misc.Launcher$AppClassLoader@5acac268
[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)
したがって、AspectJ は PerformanceAdvice を取得し、それを織り込むための 2 つの結合ポイントを見つけたようです。しかし、PerformanceAdvice の結合ポイントを に置き換えexecution(..)
てcall(..)
maven を再度実行すると、出力には最後の 2 行が含まれず、アドバイスは含まれません。実行されました。AspectJ トレースには多くのログ ステートメントが含まれていますが、あまり意味がありませんでした。エラーや警告がないかスキャンしましたが、何も見つかりませんでした。
(これらの構文はAspectJ プログラミング ガイドでそれぞれおよびとして説明されているため、単純に に置き換えることができるはずだと思いexecution(..)
ます)。call(..)
execution(MethodPattern)
call(MethodPattern)
AspectJ の最新バージョン (1.6.6) も使用してみましたが、役に立ちませんでした。