私はいくつかのRESTコントローラ、サービスクラス、ヘルパークラスを持つスプリングブートアプリケーションを持っています。コントローラーとサービスクラスはスプリング管理され、ヘルパークラスはスプリング管理されず、ほとんど静的メソッドが含まれます。スプリングアプリケーションの非スプリングBeanの読み込み時間
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AspectConfig {
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
}
対応LoggingAspectクラスは以下の通りである次のように
AspectJの構成は、コントローラが呼び出され
@Aspect
public class LoggingAspect {
@Before("allMethodsPointcut()")
public void logBeforeMethod(JoinPoint joinPoint) {
System.out.println("Entering Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
}
@After("allMethodsPointcut()")
public void logAfterMethod(JoinPoint joinPoint) {
System.out.println("Exiting Method - " + joinPoint.getSignature().getDeclaringType() + "::" + joinPoint.getSignature().getName());
}
@Pointcut("execution(* com.test.controller..*(..)) || execution(* com.test.service..*(..)) || execution(* com.test.helper..*(..))")
public void allMethodsPointcut() {
}
}
- は、アスペクト有効ロギングがために働く、Java構成中に存在しますコントローラーとサービスは機能しますが、ヘルパー機能は機能しません。
- コントローラーでヘルパークラスをオートワイヤリングする場合、非スタティックヘルパーメソッドはaspectjログの表示を開始します。しかし、静的なヘルパーメソッドは、まだAspectJのが
質問、 1.どのように我々は、など@Bean、@Autowired、@Componentなしつまり、管理されていない春のクラスのAspectJのアドバイスを設定することができますがログに記録されます表示されません。可能
が親切に詳細が必要な場合は私に知らせている場合 2.どのように我々は(私は@EnableLoadTimeWeaving使用していますが、たぶん私は何かが欠けています)静的メソッドのためにAspectJのアドバイスを設定することができ 3. AspectJの構成はJavaベースである必要があり
スタックオーバーフローに関する同様のコメントを読んだことがありますが、なぜそれが設定に含まれているEnableLoadTimeWeavingで動作していないのだろうと思います。私はEnableAspectJAutoProxyを含んでいないので、春は製織プロセスに干渉しないはずです。また、デプロイメントサーバーが私の制御下にないかもしれないので、コマンドラインのVM引数を追加することについて懐疑的です。最後の部分は、春管理されていないすべてのクラスに「設定可能」という注釈を付けるべきですか? – Avi
'@ EnableLoadTimeWeaving'はクラスローダーの魔法を使って動作します。クラスローディングを通してこのようなことをするのは常に危険なので、私は可能な限り避けようとします。だからこそ私はSpringの '@ EnableLoadTimeWeaving'を使用しません。どの環境がサポートされているかを見るには、 'LoadTimeWeaver'クラスの階層を見てください。次に、環境を選択し、追加の設定が必要な場合は、特定の実装クラスのドキュメントを参照してください。もちろん、このすべてのものを取り除き、コンパイル時に製織するだけです。サーバーを制御してエージェントを使用するだけです。 –
たとえば、Tomcatバージョン[6..8]を使用している場合は、クラスローダーを明示的に指定する必要があります: ' –