Как отключить перехватчик метода во время выполнения

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


person user325643    schedule 03.04.2012    source источник


Ответы (1)


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

person maximdim    schedule 03.04.2012
comment
Разве methodInvocation.proceed() не вызывается через отражение? - person user325643; 04.04.2012
comment
Это всего лишь мои комментарии о производительности отражения в ответе. Что заставляет вас думать, что отражение вызывает проблемы с производительностью в вашем случае? У вас есть измерения, подтверждающие это? - person maximdim; 04.04.2012