it-swarm.com.de

Wie behandelt Spring MVC mehrere Benutzer?

Ich benutze den Frühling seit mehr als 6 Monaten. Ich bin nicht in der Lage, diesen zugrunde liegenden Mechanismus im Zusammenhang mit dem folgenden Szenario zu verstehen.

Ich habe eine Spring Web App. Jetzt habe ich das Modell im Controller automatisch verkabelt. Basierend auf dem URL-Abgleich wird die entsprechende Methode aufgerufen. Alle meine Methoden sind Singleton.

Wenn nun zwei Benutzer gleichzeitig die App öffnen, kann spring sie parallel ausführen und ihnen Ergebnisse liefern. Ich habe nicht verstanden, wie das geht. Ich meine, da die Bean Singleton ist, muss sie entweder warten, bis die Bean nicht mehr verwendet wird, oder die Daten in der Bean überschreiben. Aber der Frühling funktioniert richtig. Kann jemand dieses Verhalten mit einer Analogie erklären.

Um meine Frage klar zu erklären, ist unten ein Stück Code:

Mein Standard-Controller ist einfach:

@Autowired  
private AppModel aModel; 
public AppModel getModel(){
    return aModel;
}
public void setModel(AppModel aModel){
    this.aModel = aModel;
}

@RequestMapping(method = RequestMethod.GET)
public ModelAndView defaultGetter(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(getViewName());
    mav.addObject("model", aModel);
    Runtime.getRuntime().gc();
    return mav;
}

Kann mir auch jemand sagen, wenn zwei Clients die App öffnen, werden zwei separate Modelle generiert, wenn ich @autowired verwende. Wenn nur eine Model Bean für alle Clients vorhanden ist, sagen Sie, dass die Anfrage von Client 1 eingegangen ist und ich 30 Sekunden brauche, um die Ergebnisse zurückzugewinnen. Wenn nun der zweite Client eine Anfrage in der 3. Sekunde sendet, wird dann die Anfrage des ersten Clients überschrieben?

Ich glaube, ich werde verwirrt. Kann jemand erklären, wie diese Magie geschieht?

Vielen Dank

40
javaMan

Jede Webanfrage erzeugt einen neuen Thread als in diesem Thread erklärt .

Spring verwaltet verschiedene Bereiche (Prototyp, Anfrage, Sitzung, Singleton). Wenn zwei gleichzeitige Anforderungen auf eine Singleton-Bean zugreifen, muss die Bean statusfrei sein (oder zumindest synchronisiert werden, um Probleme zu vermeiden). Wenn Sie auf eine Bean in der Bereichsanforderung zugreifen, wird pro Anforderung eine neue Instanz generiert. Spring schafft das für Sie, aber Sie müssen vorsichtig sein und den richtigen Umfang für Ihre Bohnen verwenden. Normalerweise ist Ihr Controller ein Singleton, aber das AppModel muss den Gültigkeitsbereich request haben, sonst haben Sie Probleme mit zwei gleichzeitigen Anforderungen. Dieser Thread könnte dir auch helfen .

Über Ihre letzte Frage "Wie passiert diese Magie?" Lautet die Antwort "Aspekt/Proxy". Frühling Proxy-Klassen erstellen. Sie können sich vorstellen, dass Spring einen Proxy für Ihre Klasse AppModel erstellt. Sobald Sie versuchen, im Controller darauf zuzugreifen, leitet Spring den Methodenaufruf an die rechte Instanz weiter.

31
LaurentG