Как создаются экземпляры 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.