Как отключить перехватчик метода во время выполнения - PullRequest
0 голосов
/ 03 апреля 2012

Я написал MethodInterceptor для сбора метрик производительности приложения на основе Spring.По существу, все классы обслуживания и некоторые DAO будут проходить через этот перехватчик.У меня вопрос, есть ли способ отключить этот перехватчик во время выполнения, чтобы сохранить любое влияние на производительность из-за вызова через отражение.

1 Ответ

0 голосов
/ 03 апреля 2012

Я не верю, что при использовании рефлексии в современной 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 вы можете, например, установить свойство 'bypass' на основе системного свойства Java или прочитать его из файла конфигурации.

...