Как создаются экземпляры Spring HandlerInterceptors?

Есть ли новый экземпляр Spring HandlerInterceptors для каждого запроса?

У меня есть перехватчик в Spring, который имеет поле класса.

public class MyInterceptor extends HandlerInterceptorAdapter {
    Private boolean state = false;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        state = true;
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        if (state == true) {
        System.out.println("Success");
        }
}

Если этот перехватчик используется, будет ли он всегда печатать "Успех"? (Независимо от того, сколько потоков делают это одновременно?)

1 ответ

Решение

То, как создается экземпляр перехватчика, зависит от того, как вы настроите его как компонент. Если вы не укажете явно область действия для bean-компонента, он будет одноэлементным, как и любой другой bean-компонент, и поэтому state поле будет общим для всех запросов.

В этом смысле перехватчики ничем не отличаются от контроллеров - будьте очень внимательны при размещении в них состояния диалога, поскольку объекты будут совместно использоваться запросами.

если вам действительно нужен перехватчик с состоянием и вы не хотите делить состояние между запросами, используйте bean-компонент ar equest-scoped.

Другие вопросы по тегам