如何在运行时禁用方法拦截器

时间:2012-04-03 17:28:47

标签: spring interceptor

我编写了一个MethodInterceptor来收集基于Spring的应用程序的性能指标。基本上所有服务类和一些DAO都将通过这个拦截器。我的问题是,是否有一种方法可以在运行时禁用此拦截器,以节省因反射调用而产生的任何性能影响。

1 个答案:

答案 0 :(得分: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系统属性设置'bypass'属性,或者从配置文件中读取它。