2

私はいくつかの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ベースである必要があり

答えて

3

-javaagent:/path/to/aspectjweaver-<version>.jarをstartu Jの引数を使用して読み込み時間を有効にします。 Springが純粋なAspectJの代わりに独自のSpring AOPフレームワークを使用しないように、Spring構成から@EnableAspectJAutoProxyを削除してください。オプションで、META-INF/aop.xmlを作成します。春に管理されていないBean(@Configurable POJO)に春設定を適用する場合は、@EnableSpringConfiguredを追加してください。

+0

スタックオーバーフローに関する同様のコメントを読んだことがありますが、なぜそれが設定に含まれているEnableLoadTimeWeavingで動作していないのだろうと思います。私はEnableAspectJAutoProxyを含んでいないので、春は製織プロセスに干渉しないはずです。また、デプロイメントサーバーが私の制御下にないかもしれないので、コマンドラインのVM引数を追加することについて懐疑的です。最後の部分は、春管理されていないすべてのクラスに「設定可能」という注釈を付けるべきですか? – Avi

+1

'@ EnableLoadTimeWeaving'はクラスローダーの魔法を使って動作します。クラスローディングを通してこのようなことをするのは常に危険なので、私は可能な限り避けようとします。だからこそ私はSpringの '@ EnableLoadTimeWeaving'を使用しません。どの環境がサポートされているかを見るには、 'LoadTimeWeaver'クラスの階層を見てください。次に、環境を選択し、追加の設定が必要な場合は、特定の実装クラスのドキュメントを参照してください。もちろん、このすべてのものを取り除き、コンパイル時に製織するだけです。サーバーを制御してエージェントを使用するだけです。 –

+0

たとえば、Tomcatバージョン[6..8]を使用している場合は、クラスローダーを明示的に指定する必要があります: '

関連する問題