2011-08-26 11 views
5

Esiste una nuova istanza di Spring HandlerInterceptors per ogni richiesta?Come vengono avviati Spring HandlerInterceptors?

Ho un intercettore in primavera, che ha un campo classe.

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

Se questo intercettore viene utilizzato, stampa sempre "Successo"? (Non importa quanti thread stanno facendo questo allo stesso tempo?)

risposta

5

Il modo in cui l'intercettore viene istanziato dipende da come lo si configura come un bean. Se non si specifica esplicitamente un ambito per il bean, sarà un singleton come qualsiasi altro bean, quindi il campo verrà condiviso da tutte le richieste.

In questo senso, gli interceptor non sono diversi dai controller: prestare molta attenzione a inserire lo stato di conversazione in essi, poiché gli oggetti verranno condivisi tra le richieste.

se si ha realmente bisogno di un interceptor stateful e non si desidera condividere lo stato tra le richieste, quindi utilizzare un r equest-scoped bean.

Problemi correlati