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