2011-08-26 15 views
5

是否有每個請求的Spring HandlerInterceptors的新實例?Spring HandlerInterceptors是如何實例化的?

我在Spring中有一個攔截器,它有一個class字段。

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"); 
     } 
} 

如果使用這個攔截器,它會一直打印「成功」? (無論有多少個線程同時進行此操作?)

回答

5

攔截器如何實例化取決於如何將它配置爲一個bean。如果您沒有明確指定bean的作用域,那麼它將像其他任何bean一樣成爲單例,因此state字段將由所有請求共享。

從這個意義上來說,攔截器與控制器沒有區別 - 在將對話狀態置於其中時要非常小心,因爲對象將在請求之間共享。

如果你確實需要一個有狀態的攔截器,並且你不想在請求之間共享狀態,那麼使用r equest-scoped bean