- ¿Están
applicationContext.xml
y estánspring-servlet.xml
relacionados de alguna manera en Spring Framework? - ¿Los archivos de propiedades declarados en
applicationContext.xml
estarán disponibles paraDispatcherServlet
? - En una nota relacionada, ¿por qué necesito un
*-servlet.xml
? ¿Por quéapplicationContext.xml
solo es insuficiente?
373
Respuestas:
Spring le permite definir múltiples contextos en una jerarquía padre-hijo.
El
applicationContext.xml
define los beans para el "contexto de la aplicación web raíz", es decir, el contexto asociado con la aplicación web.El
spring-servlet.xml
(o como se llame) 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 Spring (por ejemplo,spring1-servlet.xml
para servletspring1
,spring2-servlet.xml
para servletspring2
).Los frijoles en
spring-servlet.xml
pueden hacer referencia a los frijolesapplicationContext.xml
, pero no al revés.Todos los controladores Spring MVC deben ir en el
spring-servlet.xml
contexto.En la mayoría de los casos simples, el
applicationContext.xml
contexto es innecesario. Generalmente se usa para contener beans 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.fuente
escenario 1
En la aplicación cliente (la aplicación no es una aplicación web, por ejemplo, puede ser una aplicación swing)
No necesita web.xml . ApplicationContext como contenedor para obtener el servicio bean. No es necesario el contenedor del servidor web. En test-client.xml puede haber Bean simple sin control remoto , Bean con control remoto .
Conclusión : en el Escenario 1 applicationContext y
DispatcherServlet
no están relacionados.Escenario 2
En una aplicación de servidor (aplicación implementada en el servidor, por ejemplo, Tomcat). Servicio accedido a través de comunicación remota desde el programa cliente (por ejemplo, la aplicación Swing)
Definir escucha en web.xml
En el inicio del servidor, se crean
ContextLoaderListener
instancias de beans definidos en applicationContext.xml .Suponiendo que haya definido lo siguiente en applicationContext.xml :
Los beans se instancian 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:
Cuando se inicia Tomcat, se crean instancias de beans definidos en springweb-servlet.xml .
DispatcherServlet
se extiendeFrameworkServlet
. En elFrameworkServlet
frijol se produce una instanciación para la primavera. 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 comercial dentro del programa del servidor o para acceder al servicio DB en otro programa de servidor.
En web.xml se definen los siguientes:
Al inicio del servidor,
ContextLoaderListener
instancia los beans definidos en applicationContext.xml ; asumiendo que ha declarado aquí:Todos los beans se instancian de los cuatro test1.xml , test2.xml , test3.xml , test4.xml . Después de completar la creación de instancias de bean definida en applicationContext.xml , se crean instancias de beans definidos en springweb-servlet.xml .
Entonces, el orden de creación de instancias es: la raíz (contexto de la aplicación), luego FrameworkServlet.
Ahora debe quedar claro por qué son importantes en qué escenario.
fuente
DispatcherServlet
no se llamará si la url no termina con .action?Un punto más que quiero agregar. En
spring-servlet.xml
incluimos escaneo de componentes para el paquete del controlador. En el siguiente ejemplo incluimos anotaciones de filtro para el paquete del controlador.En
applicationcontext.xml
agregamos filtro para el paquete restante, excluyendo el controlador.fuente
@Controller
beans en contexto de servlet (requerido por Spring MVC).En palabras simples
applicationContext.xml
define los beans que se comparten entre todos los servlets. Si su aplicación tiene más de un servlet, entonces defina los recursos comunes en elapplicationContext.xml
tendría más sentido.spring-servlet.xml
define los beans que están relacionados solo con ese servlet. Aquí está el servlet del despachador. Por lo tanto, sus controladores Spring MVC deben estar definidos en este archivo.No hay nada de malo en definir todos los beans en
spring-servlet.xml
si está ejecutando solo un servlet en su aplicación web.fuente
En la tecnología Servlet, si desea pasar cualquier entrada a un servlet en particular, debe pasar el parámetro init como se muestra a continuación.
Si desea pasar algo de entrada que es común para todos los servlets, entonces necesita configurar el parámetro de contexto. Ejemplo
Así que exactamente así cuando trabajamos con Spring MVC necesitamos proporcionar alguna información al servlet predefinido proporcionado por Spring que es DispatcherServlet a través de init param. Entonces, la configuración es en barbecho, aquí estamos proporcionando spring-servlet.xml como parámetro de inicio para DispatcherServlet.
Nuevamente, necesitamos algunos parámetros de contexto. Eso es aplicable para toda la aplicación. Entonces podemos proporcionar el contexto raíz que es applicationcontext.xml. La configuración es así:
fuente
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 beans en el contenedor, que deben manejarse de manera programática con una fábrica de beans, pueden manejarse de manera declarativa en un contexto de aplicación. Soporte de ResourceLoader: Spring's Resource nos ofrece una abstracción genérica flexible para manejar recursos de bajo nivel. Un contexto de aplicación en sí mismo es un ResourceLoader, por lo tanto, proporciona una aplicación con acceso a instancias de recursos específicas de implementación. Soporte de MessageSource: el contexto de la aplicación implementa MessageSource, una interfaz utilizada para obtener mensajes localizados,
fuente