2012-04-03 2 views
0

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

ответ

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

+0

Является ли методInvocation.proceed() не вызванным через отражение? – user325643

+0

Это только мои комментарии об отражении в ответе. Что заставляет вас думать, что размышление вызывает проблемы с производительностью в вашем случае? Есть ли у вас какие-либо измерения, чтобы подтвердить это? – maximdim