2013-06-21 13 views
29

Używam sprężyny od ponad 6 miesięcy. Nie jestem w stanie zrozumieć tego podstawowego mechanizmu związanego z poniższym scenariuszem.W jaki sposób Spring MVC obsługuje wielu użytkowników?

Mam aplikację internetową wiosenną. Teraz wypromieniowałem model w kontrolerze. Na podstawie dopasowania adresu URL wywołuje odpowiednią metodę. wszystkie moje metody są singleton.

Teraz, gdy dwaj użytkownicy otwierają aplikację w tym samym czasie, Spring może je uruchomić równolegle i podać im wyniki. Nie wiedziałem, jak to zrobić. Mam na myśli, że jak fasola jest singleton musi albo czekać, aż fasola nie zostanie użyta, albo nadpisać dane w ziarnie. Ale wiosna działa poprawnie. Czy ktoś może wyjaśnić to zachowanie z pewną analogią.

Aby wyjaśnić moje pytanie wyraźnie poniżej jest kawałek kodu:

domyślną sterownika jest prosta:

@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; 
} 

Także może ktoś mi powiedzieć, kiedy dwaj klienci otworzyć Aplikacja będzie dwa modele oddzielne generowane, gdy używam @autowired. Jeśli dla wszystkich klientów istnieje tylko jeden komponent bean modelu, oznacza to, że żądanie klienta 1 pojawiło się, a odebranie wyników zajmie mi 30 sekund. Jeśli teraz drugi klient wyśle ​​żądanie w ciągu 3 sekund, to pierwsze żądanie klienta zostanie zastąpione?

Myślę, że jestem zdezorientowany. Czy ktoś może wyjaśnić, w jaki sposób działa ta magia?

Dzięki

+3

Powinieneś przeczytać o [wątkach w serwerach aplikacji] (http://stackoverflow.com/questions/7457190/how-threads-allocated-to -handle-servlet-request). – LaurentG

+0

Przeczytałem powyższą dyskusję, ale nadal nie jest to dla mnie jasne. Jeśli nowy wątek jest generowany dla każdego żądania, gdy tak się dzieje. czy nowy wątek będzie miał skopiowany cały zestaw nowych fasoli, aby inni użytkownicy nie zapisali tego zestawu? Nie wiem, czy mam jakiś sens: P – javaMan

+1

Fasolka to singleton, ale każda metoda otrzymuje własne odniesienie, na wątek, na stosie ... – NimChimpsky

Odpowiedz

25

Każde żądanie WWW wygenerować nowy wątek jako explained in this thread.

Spring zarządza różnymi zakresami (prototyp, żądanie, sesja, singleton). Jeśli dwa równoczesne żądania uzyskają dostęp do pojedynczego komponentu bean, komponent bean musi być bezstanowy (lub przynajmniej zsynchronizowany, aby uniknąć problemów). Jeśli uzyskasz dostęp do komponentu bean w żądaniu zakresu, wówczas dla każdego żądania zostanie wygenerowana nowa instancja. Spring zarządza tym dla ciebie, ale musisz być ostrożny i używać odpowiedniego zakresu dla swoich ziaren. Zazwyczaj twój kontroler jest singletonem, ale AppModel musi być w zakresie request, w przeciwnym razie będziesz mieć problemy z dwoma równoczesnymi żądaniami. This thread could also help you.

O twoim ostatnim pytaniu "jak ta magia się dzieje?", Odpowiedź brzmi "aspekt/proxy". Wiosenne tworzenie klas proxy. Możesz sobie wyobrazić, że Spring utworzy proxy dla twojej klasy AppModel. Gdy tylko spróbujesz uzyskać do niego dostęp w kontrolerze, Spring przekazuje wywołanie metody do instancji z prawej strony.

+0

odpowiedź była świetna, jednak mam wątpliwości ... "Wiosna przekazuje ją do właściwej instancji. " Jak to się robi? Utworzono klasę proxy i czy tworzy ona nowy obiekt proxy dla każdego złoŜonego Ŝądania? aby wartości pozostały nietknięte dla każdego żądania? –

+2

Wszystkie przykładowe programy wyjaśniające tę różnicę w każdym żądaniu będą bardziej pomocne. –

Powiązane problemy