Я написал MethodInterceptor для сбора показателей производительности приложения на основе Spring. По сути, все сервисные классы и некоторые DAO будут проходить через этот перехватчик. Мой вопрос в том, есть ли способ отключить этот перехватчик во время выполнения, чтобы сохранить любое влияние на производительность из-за вызова через отражение.Как отключить перехватчик методов во время выполнения
0
A
ответ
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 собственности, например, или читать его из конфигурационного файла.
Является ли методInvocation.proceed() не вызванным через отражение? – user325643
Это только мои комментарии об отражении в ответе. Что заставляет вас думать, что размышление вызывает проблемы с производительностью в вашем случае? Есть ли у вас какие-либо измерения, чтобы подтвердить это? – maximdim