2017-12-14 46 views
0

キャッシングLoadTimeWeavingを有効にしたSpring BootおよびEmbedded Tomcatでアスペクトが実行時に影響を受けることはありませんが、ログに細かい処理が行われています。 ../../../春 - 楽器 - 4.3:以下 EnableLoadTimeWeaving Spring Boot埋め込みTomcat

はLoadTimeWeavingはキャッシュ

@Configuration 
    @EnableConfigurationProperties 
    @EnableSpringConfigured 
    @EnableAspectJAutoProxy(proxyTargetClass = true) 
    @EnableLoadTimeWeaving 
    @EnableTransactionManagement 
    @EnableAsync 
    @EnableCaching(mode = AdviceMode.ASPECTJ) 
    public class AppConfig { 
    } 

春エージェント -javaagentのためにAspectJなどのモードと一緒に有効化され、コンフィギュレーションであります.3.RELEASE.jar

ログ

[[email protected]] debug weaving 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' 
[[email protected]] weaveinfo Join point 'method-execution(java.util.List uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway.getHierarchyLevelDefns())' in Type 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' (RestReferenceDataGateway.java:118) advised by around advice from 'org.springframework.cache.aspectj.AnnotationCacheAspect' (AbstractCacheAspect.aj:64) 
[[email protected]] weaveinfo Join point 'method-execution(java.util.Map uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway.getHierarchyLevelDefinitionMap())' in Type 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway' (RestReferenceDataGateway.java:129) advised by around advice from '**org.springframework.cache.aspectj.AnnotationCacheAspect**' (AbstractCacheAspect.aj:64) 
[[email protected]] **debug generating class** 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway$AjcClosure1' 
[[email protected]] debug generating class 'uk.co.loyalty.iss.newpro.reporting.domain.refdata.gateway.RestReferenceDataGateway$AjcClosure3' 

この周りに議論がたくさんあります。 RestartClassLoaderで製織が行われていますが、クラスローダーとは関係ありません。以下も追加してみましたか?

@Bean 
     public LoadTimeWeaver loadTimeWeaver() throws Throwable { 
      InstrumentationLoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver(); 
      return loadTimeWeaver; 
     } 

ご提案をお願いします。

プライベートメソッドでキャッシングを使用しているため、アスペクトモードが必要です。私はEnableAspectJAutoProxyを削除しましたが、それでも助けにはなりません。

ロード時間の織り方についてさらに分析したところ、以下の動作に気付きました。 私はアプリケーションをプロファイリングし、クラスローダーを調査して、キャッシング注釈が正しく動作することを確認します(クラスはトランスフォームされています)。私はクラスローダーのいくつかのクラスに気づいた、私たちは接尾辞($ AjcClosureを持つクラスを持っており、それらは織り終わった後にクラスを変換したものです)。したがって、注釈の注釈がそれらのクラスをウィーブしたクラスの一部である場合、それは正常に動作します。 それから、クラスが正しく織り込まれているクラスと、正しくクラス化されていないクラスがよく分かりました。次に、織りが起こる前にクラスが既にクラスローダーにロードされている場合、それが織りが起こっていない場所です。上記の場合

@Bean 
    public IAService aService(){ 
     return new AServiceImpl(); 
    } 

、クラスAServiceImplは(負荷時間ウィービングとキャッシングが完璧に動作した後)、このインスタンスが必要とされる場合にのみ、クラスローダにロードされます。 しかし、同じクラスが@Componentを使用して初期化されている場合、それはウィービングされていません。春のコンテナを初期化し、ロード時間織りは、その後織りしようとしている間に

@Service 
public class AServiceImpl{ 
} 

私が思うには、上記の場合には、クラスAServiceImpl)は、クラスローダにロードされます。

クラスローダーでもこの現象が再確認されました。ですから、aspectjが既にロードされているクラスを織りようとすると問題になります。同じ問題がSpring Jiraでも以下のリンクで発生しました。

https://jira.spring.io/browse/SPR-13786

上記のリンクで述べたように、私は以下のようなJavaエージェントとしてAspectJのウィーバーを渡した場合、すべてのクラスが正しく織り込まれています。それで、2人のエージェントを持つことが必要なのでしょうか、それとも他の選択肢がありますか?

-javaagent:../../../aspectjweaver-1.6.1.jar 
-javaagent:../../../spring-instrument-4.3.3.RELEASE.jar 
+1

あなたの質問は私を困惑させる。それは本当にAspectJについてですか、あるいはプロキシベースのSpring AOPですか? '@ EnableAspectJAutoProxy'(Spring AOP)と' @ EnableLoadTimeWeaving'(AspectJ)の両方を設定するからです。そのうちの1つだけを使用してください。とにかくAspectJが必要なのはなぜだと思いますか?プライベートメソッドインターセプト、Spring AOPでサポートされていないポイントカットタイプなど、Spring AOPにはない機能を使用していますか?あるいは、 'this.myMethod()'のような、あなたのターゲットクラスによって作られた内部呼び出しをトレースしたいでしょうか?後者は、あなたの注釈 '@EnableCaching(mode = AdviceMode.ASPECTJ)'が示唆しているものです。ありがとう@kriegaex。 – kriegaex

+0

私は、クラスローダーが私の質問に詳細を追加すると、行に沿ってさらに調査しました。ありがとう@kriegaex – Raju

答えて

0

はい、ウィーバーは前織り目標はクラスローダによってロードされ、アクティブにする必要があります。

私はAspectJのオタクですが、コンテナオタクではなく、主にJava SEとコンテナなしで動作します。

-javaagent:path/to/aspectjweaver.jar 

をコマンドラインに追加して、役立つかどうか確認してください。

+0

を提案してください。 Javaエージェントとしてaspectjweaver-1.6.1.jarを追加することで、問題が解決されたと述べました。私はこれがSpringでの唯一のオプションだと思う。なぜなら、私たちはxmlで設定をしているときにこの問題に直面していないからだ。もう一度お返事します – Raju

+0

この問題をもう少し詳しく調査したい場合は、私が[見つけた](https://stackoverflow.com/questions/35993888)、おそらく助けてください。 :-) – kriegaex

関連する問題