4

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) も使用してみましたが、役に立ちませんでした。

4

2 に答える 2

2

呼び出し指定子は、ポイントカットで機能する必要があります。

パッケージ内の呼び出しクラスは weaver 要素で指定されていますか?

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

呼び出しクラスと実行クラスが異なるパッケージにあり、実行で機能する場合は、aop.xml ファイルを修正するか、呼び出しクラスをリファクタリングして特定のパッケージに含めます。

于 2010-06-22T22:06:37.847 に答える
0

実際のaspectJエージェントを使用していますか? 実行時に JRE に渡すように

-javaagent:lib/aspectjweaver.jar

これが、Spring AOPではなくaspectJ AOPを取得できる唯一の方法であることがわかりました

于 2010-06-22T21:22:22.710 に答える