Laden des Kontexts im Frühjahr mit web.xml

68

Gibt es eine Möglichkeit, einen Kontext mithilfe von web.xml in einer Spring MVC-Anwendung zu laden?

Ganesh
quelle

Antworten:

118

Aus den Frühlingsdokumenten

Spring kann problemlos in jedes Java-basierte Webframework integriert werden. Sie müssen lediglich den ContextLoaderListener in Ihrer web.xml deklarieren und mithilfe einer contextConfigLocation festlegen, welche Kontextdateien geladen werden sollen.

Die <context-param>:

<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> 

Sie können dann den WebApplicationContext verwenden, um Ihre Beans in den Griff zu bekommen.

WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());
SomeBean someBean = (SomeBean) ctx.getBean("someBean");

Weitere Informationen finden Sie unter http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/web/context/support/WebApplicationContextUtils.html

ddewaele
quelle
2
Wie greife ich auf den Kontext zu? und Wollen Sie damit sagen, dass der Kontext mit Spring Context geladen wird, sobald die Anwendung gestartet wird? Bitte klären Sie, weil ich neu im Frühling bin. Vielen Dank für Ihre Antwort
Ganesh
Hier ist der Link für die neuesten APIs im Zusammenhang mit WebApplicationContextUtils. docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
Ajitesh
34

Sie können auch die Kontextposition relativ zum aktuellen Klassenpfad angeben, was möglicherweise vorzuziehen ist

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext*.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
fmucar
quelle
Welche Bedeutung hat das *? Ohne geht es nicht:IOException parsing XML document from ServletContext resource [/>classpath:/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/>classpath:/applicationContext.xml]
DavidS
1
Ich habe gerade einen Blog-Beitrag gefunden, der meine Frage classpath* hier beantwortet .
DavidS
17

Sie können den Kontext auch laden, während Sie das Servlet selbst definieren ( WebApplicationContext ).

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

eher als ( ApplicationContext )

<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> 

oder kann beides zusammen machen.

Der Nachteil der Verwendung von WebApplicationContext besteht darin, dass der Kontext nur für diesen bestimmten Spring-Einstiegspunkt ( DispatcherServlet) geladen wird, wobei wie bei den oben genannten Methoden der Kontext für mehrere Einstiegspunkte (z. B. Webservice Servlet, REST servletusw.) geladen wird.

Der von geladene Kontext ContextLoaderListenerist infact ein übergeordneter Kontext zu dem speziell für DisplacherServlet geladenen. Grundsätzlich können Sie also alle Ihre Business Service-, Datenzugriffs- oder Repository-Beans im Anwendungskontext laden und Ihren Controller trennen und Resolver-Beans in WebApplicationContext anzeigen.

Aniket Thakur
quelle