2012-04-03 3 views
0

Spring 기반 응용 프로그램의 성능 메트릭을 수집하기 위해 MethodInterceptor를 작성했습니다. 본질적으로 모든 서비스 클래스와 일부 DAO는이 인터셉터를 통과하게됩니다. 내 질문은 런타임 중에이 인터셉터를 사용하지 않도록 설정하여 리플렉션을 통해 호출로 인한 성능 영향을 저장하는 것입니다.런타임시 메서드 인터셉터를 비활성화하는 방법

답변

0

현대 JVM에서 리플렉션을 사용할 때 상당한 성능 저하가 있다고 생각하지 않습니다. 또한 인터셉터를 동적으로 비활성화하는 쉬운 방법이 없다고 생각합니다.

방해하지 않으려는 인터셉터에서 간단한 처리를 수행하고 있다면 인터셉터에서 런타임에 설정할 수있는 일부 속성을 점검하는 것이 가장 쉬운 방법 일 수 있습니다. 이런 식으로 뭔가 작업을해야합니다 :

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; 
} 

당신의 Spring 컨텍스트 파일은 예를 들어 Java 시스템 등록 정보를 기반으로 '우회'속성을 설정하거나 설정 파일에서 그것을 읽을 수있다.

+0

reflection을 통해 methodInvocation.proceed()가 호출되지 않았습니까? – user325643

+0

답변에서 반사 성능에 대한 의견은 참조하십시오. 당신의 반성으로 인해 성능 문제가 발생한다고 생각하는 이유는 무엇입니까? 그걸 확인하기위한 측정이 있니? – maximdim

관련 문제