Solución:
Su comprensión es correcta. los ApplicationContext
es donde viven los frijoles de primavera. El propósito de ContextLoaderListener
es doble:
-
para atar el ciclo de vida del
ApplicationContext
al ciclo de vida delServletContext
y -
para automatizar la creación del
ApplicationContext
, por lo que no tiene que escribir código explícito para crearlo, es una función de conveniencia.
Otra cosa conveniente sobre el ContextLoaderListener
es que crea un WebApplicationContext
y WebApplicationContext
proporciona acceso a la ServletContext
vía ServletContextAware
frijoles y el getServletContext
método.
ContextLoaderListener
es Opcional. Solo para señalar un punto aquí: puede iniciar una aplicación Spring sin tener que configurar ContextLoaderListener
, solo un mínimo básico web.xml
con DispatcherServlet
.
Así es como se vería:
web.xml
<?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_2_5.xsd"
id="WebApp_ID"
version="2.5">
<display-name>Some Minimal Webapp</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
Crea un archivo llamado dispatcher-servlet.xml
y guárdalo debajo WEB-INF
. Como mencionamos index.jsp
en la lista de bienvenida, agregue este archivo en WEB-INF
.
despachador-servlet.xml
En el dispatcher-servlet.xml
define tus frijoles:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="bean1">
...
</bean>
<bean id="bean2">
...
</bean>
<context:component-scan base-package="com.example" />
<!-- Import your other configuration files too -->
<import resource="other-configs.xml"/>
<import resource="some-other-config.xml"/>
<!-- View Resolver -->
<bean
id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property
name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Para una aplicación Spring simple, no es necesario definir ContextLoaderListener
en tus web.xml
; puede poner todos sus archivos de configuración de Spring en <servlet>
:
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc-core-config.xml, classpath:spring/business-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Para una aplicación Spring más compleja, donde tiene múltiples DispatcherServlet
definido, puede tener los archivos de configuración comunes de Spring que son compartidos por todos los DispatcherServlet
definido en el ContextLoaderListener
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/common-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc1-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>mvc2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mvc2-config.xmll</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Solo ten en cuenta ContextLoaderListener
realiza el trabajo de inicialización real para el raíz contexto de la aplicación.
Encontré que este artículo ayuda mucho: Spring MVC – Contexto de aplicación vs contexto de aplicación web