Różnica między applicationkontekst.xml i spring-servlet.xml w Spring Framework

  • czy applicationContext.xml i spring-servlet.xml są w jakikolwiek sposób powiązane w Spring Framework?
  • czy pliki właściwości zadeklarowane w applicationContext.xml będą dostępne dla DispatcherServlet?
  • W związku z tym, dlaczego w ogóle potrzebuję *-servlet.xml? Dlaczego sama applicationContext.xml jest niewystarczająca?
 334
Author: Do Nhu Vy, 2010-09-06

6 answers

Spring pozwala zdefiniować wiele kontekstów w hierarchii rodzic-dziecko.

applicationContext.xml definiuje fasolę dla "głównego kontekstu webapp", tj. kontekstu związanego z webapp.

spring-servlet.xml (Czy jak to inaczej nazwiesz) definiuje beans dla kontekstu aplikacji jednego z serwletów. Może być wiele z nich w webapp, jeden na serwlet sprężyny (np. {[2] } dla servleta spring1, spring2-servlet.xml dla servlet spring2).

Fasola w spring-servlet.xml może odnosić się do fasoli w applicationContext.xml, ale nie do występku versa.

Wszystkie kontrolery MVC Spring muszą działać w kontekście spring-servlet.xml.

W większości prostych przypadków kontekst applicationContext.xml jest niepotrzebny. Jest zwykle używany do przechowywania ziaren, które są współdzielone między wszystkimi serwletami w aplikacji internetowej. Jeśli masz tylko jeden servlet, to nie ma zbyt wiele sensu, chyba że masz do niego konkretne zastosowanie.

 400
Author: skaffman,
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
2010-09-06 14:10:18

Scenariusz 1

W aplikacji klienckiej (aplikacja nie jest aplikacją webową, np. może być aplikacją swing)
private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

Nie ma potrzeby www.xml . Applicationkontekst jako kontener do pobierania usługi bean. Nie ma potrzeby używania kontenera serwera www. W Test-client.xml może być prosta fasola bez remotowania, fasola z remotowaniem.

Wniosek: w scenariuszu 1 applicationContext i DispatcherServlet nie są ze sobą powiązane.

Scenariusz 2

Na serwerze aplikacja (aplikacja wdrożona na serwerze np. Tomcat). Dostęp do usługi za pomocą remotingu z programu klienta (np. aplikacji Swing)

Define listener in web.xml

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Przy starcie serwera ContextLoaderListener tworzy instancje beans zdefiniowane w applicationContext.xml .

Zakładając, że zdefiniowałeś następujące elementy w applicationContext.xml :

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Ziarna są tworzone ze wszystkich czterech plików konfiguracyjnych test1.xml , test2.xml, test3.xml, test4.xml .

Wniosek: w scenariuszu 2 applicationContext i DispatcherServlet nie są ze sobą powiązane.

Scenariusz 3

W aplikacji webowej z spring MVC.

W www.XML define:

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Po uruchomieniu Tomcat, beans zdefiniowany w springweb-servlet.xml {[20] } są tworzone jako instancje. DispatcherServlet rozszerza FrameworkServlet. W FrameworkServlet instancjacja fasoli ma miejsce dla springweb . W naszym przypadku springweb to FrameworkServlet.

Wniosek: w scenariuszu 3 applicationContext i DispatcherServlet nie są ze sobą powiązane.

Scenariusz 4

W aplikacji webowej z spring MVC. springweb-servlet.xml dla servlet i applicationContext.xml do uzyskiwania dostępu do usługi biznesowej w programie serwerowym lub dostępu do usługi DB w innym programie serwerowym.

W www.xml są następujące zdefiniowano:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>springweb</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>
    <servlet-name>springweb</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

Przy starcie serwera, ContextLoaderListener tworzy instancje beans zdefiniowane w applicationContext.xml ; zakładając, że zadeklarowałeś tutaj:

<import resource="test1.xml" />
<import resource="test2.xml" />
<import resource="test3.xml" />
<import resource="test4.xml" />

Wszystkie ziarna są instancjowane ze wszystkich czterech test1.xml, test2.xml, test3.xml, test4.xml . Po zakończeniu instancji bean zdefiniowanej w applicationContext.xml następnie zdefiniowane w springweb-servlet.xml {[20] } są tworzone jako instancje.

Więc kolejność instancji jest root to kontekst aplikacji, a następnie FrameworkServlet.

Teraz wyjaśnia, dlaczego są one ważne w jakim scenariuszu.

 96
Author: abishkar bhattarai,
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-01-06 14:15:50

Jeszcze jedna uwaga, którą chcę dodać. W spring-servlet.xml dołączamy skanowanie komponentów dla pakietu kontrolera. W poniższym przykładzie dodajemy adnotację filtra dla pakietu kontrolera.

<!-- Scans for annotated @Controllers in the classpath -->
<context:component-scan base-package="org.test.web" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

W applicationcontext.xml dodajemy filtr dla pozostałego pakietu z wyłączeniem kontrolera.

<context:component-scan base-package="org.test">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
 52
Author: Raje,
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
2015-03-23 15:06:06

W prostych słowach,

applicationContext.xml definiuje ziarna, które są wspólne dla wszystkich serwletów. Jeśli Twoja aplikacja ma więcej niż jeden servlet, zdefiniowanie wspólnych zasobów w applicationContext.xml miałoby większy sens.

spring-servlet.xml definiuje ziarna, które są związane tylko z tym serwletem. Oto serwlet dyspozytora. Tak więc twoje Kontrolery Spring MVC muszą być zdefiniowane w tym pliku.

Nie ma nic złego w definiowaniu wszystkich fasoli w spring-servlet.xml Jeśli używasz tylko jednego servleta w Twojej aplikacji internetowej.

 10
Author: Krishna,
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
2016-02-25 13:03:46

Konteksty aplikacji zapewniają środki do rozwiązywania wiadomości tekstowych, w tym obsługę i18n tych wiadomości. Konteksty aplikacji zapewniają ogólny sposób ładowania zasobów plików, takich jak obrazy. Konteksty aplikacji mogą publikować zdarzenia do fasoli, które są zarejestrowane jako słuchacze. Niektóre operacje na pojemniku lub fasoli w pojemniku, które muszą być obsługiwane w sposób programowy za pomocą fabryki fasoli, mogą być obsługiwane deklaratywnie w kontekście aplikacji. ResourceLoader Wsparcie: Interfejs zasobów Springa zapewnia elastyczną abstrakcję generyczną do obsługi zasobów niskiego poziomu. Sam kontekst aplikacji jest Resourceloaderem, dlatego zapewnia aplikacji dostęp do instancji zasobów specyficznych dla wdrożenia. Obsługa MessageSource: kontekst aplikacji implementuje MessageSource, interfejs używany do uzyskiwania zlokalizowanych wiadomości, z rzeczywistą implementacją jest pluggable

 4
Author: Sujata,
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
2014-08-06 15:51:30

W technologii Servlet jeśli chcesz przekazać jakieś dane wejściowe do konkretnego servleta, musisz przekazać init param jak poniżej.

 <servlet>
    <servlet-name>DBController</servlet-name>
    <servlet-class>com.test.controller.DBController</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>John</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>DBController</servlet-name>
    <url-pattern>/DBController</url-pattern>
</servlet-mapping>

Jeśli chcesz przekazać część w put, która jest wspólna dla wszystkich servletów, musisz skonfigurować context param. Przykład

 <context-param>
    <param-name>email</param-name>
    <param-value>[email protected]</param-value>
</context-param>

Więc dokładnie tak jak teraz kiedy kiedykolwiek pracujemy z Spring MVC musimy dostarczyć pewne informacje do predefiniowanego servletu dostarczanego przez Spring czyli DispatcherServlet poprzez INIT param. Tak więc konfiguracja jest jak fallows, tutaj dostarczamy Spring-servlet.xml jako parametr init do DispatcherServlet.

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Spring MVC App</display-name>

    <servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
</web-app>

Znowu potrzebujemy jakiegoś kontekstu param. Dotyczy to całego zastosowania. Możemy więc podać główny kontekst, którym jest applicationcontext.xml Konfiguracja wygląda tak:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationcontext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
        <servlet-name>SpringController</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringController</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
 3
Author: Rajanikanta Pradhan,
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-09-20 11:49:36