Diferencia entre applicationContext.xml y spring-servlet.xml en Spring Framework


  • Están applicationContext.xml y spring-servlet.xml relacionados de todos modos en Spring Framework?
  • ¿Los archivos de propiedades declarados en applicationContext.xml estarán disponibles para DispatcherServlet?
  • En una nota relacionada, ¿por qué necesito un *-servlet.xml en absoluto? ¿Por qué applicationContext.xml por sí solo es insuficiente?
 334
Author: Do Nhu Vy, 2010-09-06

6 answers

Spring le permite definir múltiples contextos en una jerarquía padre-hijo.

El applicationContext.xml define los frijoles para el "contexto raíz de la aplicación web", es decir, el contexto asociado con la aplicación web.

El spring-servlet.xml (o como sea que lo llames) define los beans para el contexto de la aplicación de un servlet. Puede haber muchos de estos en una aplicación web, uno por servlet de primavera (por ejemplo, spring1-servlet.xml para servlet spring1, spring2-servlet.xml para servlet spring2).

Los frijoles en spring-servlet.xml pueden hacer referencia a los frijoles en applicationContext.xml, pero no al vicio viceversa.

Todos los controladores MVC de Spring deben ir en el contexto spring-servlet.xml.

En la mayoría de los casos simples, el contexto applicationContext.xml es innecesario. Generalmente se usa para contener frijoles que se comparten entre todos los servlets en una aplicación web. Si solo tiene un servlet, entonces no tiene mucho sentido, a menos que tenga un uso específico para él.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-06 14:10:18

Escenario 1

En la aplicación cliente (la aplicación no es una aplicación web, por ejemplo, puede ser una aplicación swing)

private static ApplicationContext context = new  ClassPathXmlApplicationContext("test-client.xml");

context.getBean(name);

No hay necesidad de web.xml . ApplicationContext como contenedor para obtener el servicio bean. No hay necesidad de contenedor de servidor web. En cliente de prueba.xml puede haber Simple bean sin remoting, bean con remoting.

Conclusión : En el escenario 1 ApplicationContext y DispatcherServlet no están relacionados.

Escenario 2

En un servidor aplicación (aplicación desplegada en el servidor, por ejemplo, Tomcat). Acceso al servicio a través de la comunicación remota desde el programa cliente (por ejemplo, la aplicación Swing)

Define el oyente en web.xml

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

Al iniciar el servidor ContextLoaderListener crea instancias de frijoles definidos en ApplicationContext.xml .

Suponiendo que haya definido lo siguiente en ApplicationContext.xml :

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

Los beans se instancian a partir de los cuatro archivos de configuración test1.xml, test2.xml, test3.xml, test4.xml .

Conclusión : En el escenario 2 ApplicationContext y DispatcherServlet no están relacionados.

Escenario 3

En una aplicación web con spring MVC.

En web.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>

Cuando se inicia Tomcat, beans se define en springweb-servlet.xml se instancian. DispatcherServlet se extiende FrameworkServlet. En FrameworkServlet la instanciación de bean tiene lugar para springweb . En nuestro caso springweb es FrameworkServlet.

Conclusión : En el escenario 3 ApplicationContext y DispatcherServlet no están relacionados.

Escenario 4

En aplicación web con spring MVC. springweb-servlet.xml para servlet y ApplicationContext.xml para acceder al servicio empresarial dentro del programa servidor o para acceder al servicio de base de datos en otro programa servidor.

En web.xml los siguientes son definido:

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

Al iniciar el servidor, ContextLoaderListener crea instancias de beans definidas en ApplicationContext.xml; suponiendo que haya declarado aquí:

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

Los frijoles están todos instanciados de los cuatro test1.xml, test2.xml, test3.xml, test4.xml . Después de completar la instanciación de bean definida en ApplicationContext.xml luego beans definido en springweb-servlet.xml se instancian.

So el orden de instanciación es raíz es contexto de la aplicación, luego FrameworkServlet.

Ahora deja claro por qué son importantes en qué escenario.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-06 14:15:50

Un punto más que quiero añadir. En spring-servlet.xml incluimos el análisis de componentes para el paquete Controlador. En el siguiente ejemplo incluimos la anotación de filtro para el paquete controlador.

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

En applicationcontext.xml agregamos filtro para el paquete restante excluyendo el controlador.

<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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-23 15:06:06

En palabras simples,

applicationContext.xml define los frijoles que se comparten entre todos los servlets. Si su aplicación tiene más de un servlet, entonces definir los recursos comunes en el applicationContext.xml tendría más sentido.

spring-servlet.xml define los frijoles que están relacionados solo con ese servlet. Aquí está el despachador servlet. Por lo tanto, sus controladores MVC de Primavera deben definirse en este archivo.

No hay nada malo en definir todos los frijoles en el spring-servlet.xml si está ejecutando solo un servlet en su aplicación web.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 13:03:46

Los contextos de aplicación proporcionan un medio para resolver mensajes de texto, incluido el soporte para i18n de esos mensajes. Los contextos de aplicación proporcionan una forma genérica de cargar recursos de archivos, como imágenes. Los contextos de aplicación pueden publicar eventos en beans que están registrados como oyentes. Ciertas operaciones en el contenedor o frijoles en el contenedor, que deben manejarse de manera programática con una fábrica de frijoles, se pueden manejar declarativamente en un contexto de aplicación. ResourceLoader soporte: La interfaz de recursos de Spring es una abstracción genérica flexible para manejar recursos de bajo nivel. Un contexto de aplicación en sí es un cargador de recursos, por lo tanto, proporciona una aplicación con acceso a instancias de recursos específicas de la implementación. Soporte MessageSource: El contexto de la aplicación implementa MessageSource, una interfaz utilizada para obtener mensajes localizados, con la implementación real conectable

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 15:51:30

En la tecnología Servlet si desea pasar cualquier entrada a un servlet en particular, debe pasar el parámetro init como el código siguiente.

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

Si desea pasar algo en put que es común para todos los servlets, entonces ese tiempo necesita configurar el parámetro de contexto. Ejemplo

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

Así que exactamente como esto cuando estamos trabajando con Spring MVC necesitamos proporcionar alguna información al servlet Predefinido proporcionado por Spring que es DispatcherServlet a través de init param. Así que el la configuración es como barbecho, aquí estamos proporcionando el resorte-servlet.xml como parámetro init para 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>

De nuevo necesitamos un param de contexto. Eso es aplicable para toda la aplicación. Así que podemos proporcionar el contexto raíz que es applicationcontext.XML La configuración es así:

    <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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 11:49:36