2012-04-03 11 views
0

Springベースのアプリケーションのパフォーマンスメトリックを収集するためにMethodInterceptorを記述しました。基本的にすべてのサービスクラスといくつかのDAOがこのインターセプタを経由します。私の質問は、リフレクション経由の呼び出しによるパフォーマンスの影響を抑えるために、実行時にこのインターセプタを無効にする方法があるかどうかです。実行時にメソッドインターセプタを無効にする方法

答えて

0

現代のJVMでリフレクションを使用すると、パフォーマンスが大幅に低下するとは思われません。また、インターセプタを動的に無効にする簡単な方法はないと思います。

邪魔したくないインターセプタで処理を行う場合は、実行時に設定できるプロパティをインターセプタでチェックするのが最も簡単な方法です。このような何か作業をする必要があります:あなたのSpringコンテキストファイルで

public abstract class BaseInterceptor implements MethodInterceptor { 
    private boolean bypass; 

    /** 
    * If set to true all processing defined in child class will be bypassed 
    * This could be useful if advice should have flexibility of being turned ON/OFF via config file 
    * */ 
    public void setBypass(boolean bypass) { 
    this.bypass = bypass; 
    } 

    public final Object invoke(MethodInvocation methodInvocation) throws Throwable { 
     if (bypass) { 
     return methodInvocation.proceed(); 
     } 
     this.logger.debug(">>>"); 
     return onInvoke(methodInvocation); 
    } 

    protected abstract Object onInvoke(MethodInvocation methodInvocation) throws Throwable; 
} 

ます。たとえば、Javaシステムプロパティに基づいて、「バイパス」プロパティを設定するか、設定ファイルからそれを読むことができました。

+0

methodInvocation.proceed()はリフレクションによって呼び出されませんか? – user325643

+0

それは答えの反射のパフォーマンスに関する私のコメントを参照してください。あなたは、反射があなたのケースでパフォーマンスの問題を引き起こしていると思いますか?それを確認するための測定値はありますか? – maximdim

関連する問題