Dlaczego Spring MVC potrzebuje co najmniej dwóch kontekstów?

W Spring MVC istnieją dwa konteksty. Jednym z nich jest kontekst aplikacji lub kontekst globalny, który jest uruchamiany przez ContextLoaderListener. Pobiera wszystkie pliki konfiguracyjne wymienione w parametrze contextConfigLocation.

Teraz, jeśli używasz również Spring MVC, wymagany jest Dispatcher servlet, który uruchamia inny kontener znany również jako web application container. Kontener ten przyjmuje globalny kontener jako rodzica.

Podczas integrowania struts1 ze sprężyną, istnieje tylko jeden kontekst. Dlaczego spring mvc potrzebuje dwóch? Czy jest możliwe użycie tylko jednego kontekstu Podczas korzystania z spring mvc?

Dzięki!
Author: zagyi, 2013-09-08

3 answers

Wyobraź sobie, że masz dwóch różnych dyspozytorów, każdy służący innym celom i każdy mający swoje własne zależności. Można skonfigurować je niezależnie za pomocą oddzielnych kontekstów.

Jeśli istnieje jakakolwiek wspólna konfiguracja, może to przejść do kontekstu 'globalnego'.

Nie wydaje mi się, aby możliwe było posiadanie tylko jednego kontekstu przy użyciu DispatcherServlet, ponieważ tworzy on swój własny kontekst i łączy go z kontekstem nadrzędnym (poprzez superklasę frameworkservlet).

FrameworkServlet.createWebApplicationContext

 14
Author: Paul Grime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-08 13:35:41

Posiadanie głównego kontekstu aplikacji sieci Web plus kontekstu serwletów potomnych jest tylko opcją. Jeśli wiesz, że Twoja aplikacja nie będzie miała drugiego servleta, prawdopodobnie łatwiej jest mieć jeden kontekst Spring dla całej aplikacji internetowej.

Możesz osiągnąć tę konfigurację po prostu usuwając ContextLoaderListener (i towarzyszący im contextConfigLocation context-param) z web.xml i przenosząc wszystkie definicje bean do XML definiującego kontekst servleta ([servlet-name]-servlet.xml).

Jest to możliwe, ponieważ FrameworkServlet (super-class of DispatcherServlet) nie dba o to, czy istnieje kontekst aplikacji root podczas tworzenia kontekstu serwletu. Po prostu przekazuje kontekst główny Jako rodzic, jeśli jest dostępny. Zobacz powiązany kod tutaj .

 17
Author: zagyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-08 17:22:34

Sprawdź tę odpowiedź o wielu kontenerach w spring framework

Tak, możesz mieć tylko jeden kontekst.

W przypadku ponownego użycia kodu lepiej byłoby wyodrębnić usługi w kontekście aplikacji, a nie Webaplicationcontext.ale to nie przymus.możesz zachować tylko webaplicationkontekst.

 5
Author: beinghuman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:59:55