2013-09-08 11 views
19

Wiosną MVC istnieją dwa konteksty. Jednym z nich jest kontekst aplikacji lub kontekst globalny uruchamiany przez ContextLoaderListener. Zajmuje wszystkie pliki konfiguracyjne wymienione w parametrze contextConfigLocation.Dlaczego Spring MVC potrzebuje co najmniej dwóch kontekstów?

Teraz, jeśli używasz także Spring MVC, wymagany jest serwlet Dispatcher, który uruchamia inny kontener, znany również jako kontener aplikacji WWW. Ten kontener pobiera kontener globalny jako obiekt nadrzędny.

Podczas integracji rozpór1 ze sprężyną istnieje tylko jeden kontekst. Dlaczego wiosna mvc potrzebuje dwóch? Czy możliwe jest użycie tylko jednego kontekstu przy użyciu sprężyny mvc?

dziękuję!

Odpowiedz

12

Wyobraź sobie, że masz dwóch oddzielnych dyspozytorów, z których każdy służy innym celom, a każdy ma swoje własne zależności. Można skonfigurować je niezależnie, używając osobnych kontekstów.

Jeśli istnieje jakaś wspólna konfiguracja, może to nastąpić w kontekście "globalnym".

Nie sądzę, że możliwe jest posiadanie tylko jednego kontekstu przy użyciu DispatcherServlet, ponieważ tworzy on własny kontekst i łączy go z kontekstem nadrzędnym (przez nadrzędną klasę FrameworkServlet).

FrameworkServlet.createWebApplicationContext

14

uwzględniając kontekst aplikacji korzeń internetową plus kontekstu serwletu dziecko jest tylko opcja. Jeśli wiesz, że twoja aplikacja nie będzie miała drugiego apletu, prawdopodobnie łatwiej będzie mieć jeden kontekst Spring dla całej aplikacji internetowej.

Można osiągnąć ten setup po prostu usuwając ContextLoaderListener (i towarzyszące contextConfigLocation kontekstowe-param) z web.xml i porusza wszystkie definicje fasoli w xml określającej kontekstu serwletu ([servlet-name]-servlet.xml).

Jest to możliwe, ponieważ FrameworkServlet (super-klasy DispatcherServlet) nie obchodzi, jeśli istnieje kontekst aplikacji root podczas tworzenia kontekstu serwletu. Po prostu przekazuje kontekst główny jako rodzic, jeśli jest dostępny. Zobacz related code here.

5

Sprawdź tę odpowiedź About multiple containers in spring framework

Tak, można mieć tylko jeden kontekst.

Do ponownego użycia kodu lepiej byłoby wyodrębnić usługi w kontekście aplikacji, a nie WebApplicationContext.Ale to nie jest kompulsyjne. Możesz zachować tylko tylko webApplicationcontext.

Powiązane problemy