2015-10-15 14 views
8

ho la seguente Spring regolatore:Spring MVC RestController portata

package hello; 

import java.util.concurrent.atomic.AtomicLong; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class TestController { 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/test") 
    public String test() { 
     long val = counter.incrementAndGet(); 
     return String.valueOf(val); 
    } 
} 

Ogni volta accede l'API REST, esso restituisce un valore incrementato. Sto solo imparando Java e mi chiedo perché non restituisca sempre 1 come una nuova istanza di AtomicLong deve essere stata creata ogni volta che viene richiesta.

+2

Perché pensi che stia creando una nuova istanza? – chrylis

+0

@chrylis: Sono originario di .net background e ho appena avuto un confronto con esso. –

risposta

9

No, il bean TestController è in realtà un singleton. L'annotazione @RestController dichiara una molla @Component il cui ambito è di default SINGLETON. Questo è documentato nel @Scope nota:

predefiniti su una stringa vuota ("") che implica SCOPE_SINGLETON.

Ciò significa che sarà la stessa istanza di TestController che gestirà tutte le richieste. Poiché counter è una variabile di istanza, sarà uguale per ogni richiesta.

+0

È buona norma mantenerlo singleton o impostare l'ambito sul cosiddetto 'prototipo'? –

+0

@BabuJames Per un 'Controller', direi che è meglio tenerlo un singleton. 'I controller non sono in genere stateful quindi ha senso renderli singleton. – Tunaki

2

A @RestController non viene creato per ogni richiesta, rimane lo stesso per ogni richiesta. Quindi il tuo counter mantiene il suo valore e viene incrementato ogni volta.