我编写了一个MethodInterceptor来收集基于Spring的应用程序的性能指标。基本上所有服务类和一些DAO都将通过这个拦截器。我的问题是,是否有一种方法可以在运行时禁用此拦截器,以节省因反射调用而产生的任何性能影响。
答案 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'属性,或者从配置文件中读取它。