Los alcances solicitud
, session
, aplicación
y websocket
solo están disponibles si usas el implementación ApplicationContext
en un marco Spring habilitado para web (por ejemplo, XmlWebApplicationContext
). Si utiliza estos ámbitos con contenedores Spring IoC normales, como ClassPathXmlApplicationContext
, se generará una IllegalStateException
indicando que el alcance del bean es desconocido.
Configuración web inicial
Para admitir la creación de alcance de bean en los niveles request
, session
, application
y websocket
(web -contenedores con ámbito) requiere cierta configuración inicial antes de definir un contenedor. (Esta configuración inicial no es necesaria para los ámbitos estándar: singleton
y prototype
).
La forma de realizar esta configuración inicial depende de su entorno de servlet específico.
Si accede a beans que están dentro del alcance de Spring Web MVC, es decir, como parte de una solicitud manejada por Spring DispatcherServlet
, no se requiere ninguna configuración especial. DispatcherServlet
ya expone todos los estados relevantes.
Si está utilizando un contenedor web Servlet 2.5 que maneja solicitudes fuera del DispatcherServlet
de Spring (por ejemplo, cuando usa JSF o Struts), debe registrar org.springframework.web.context.request.RequestContextListene
. Para Servlet 3.0+, esto se puede hacer mediante programación usando la interfaz WebApplicationInitializer
. Alternativamente, o para versiones anteriores de contenedores, agregue la siguiente declaración al archivo web web.xml
de su aplicación web:
<web-app>
...
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
Como alternativa, si tiene problemas para configurar el oyente, considere usar RequestContextFilter
de Spring. La visualización de filtros depende de la configuración de la aplicación web circundante, por lo que debe cambiarla en consecuencia. El siguiente listado muestra parte de un filtro de aplicación web:
<web-app>
...
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
DispatcherServlet
, RequestContextListener
y RequestContextFilter
hacen lo mismo, es decir, asociar un objeto de solicitud HTTP con un Thread
que atiende esta petición. Esto permite acceder a los beans dentro del alcance de la solicitud o sesión más abajo en la cadena de llamadas.
Alcance de la solicitud
Considere la siguiente configuración XML para definir un bean:
<bean id="loginAction" class="com.something.LoginAction" alcance="request"/>
El contenedor Spring crea una nueva instancia del bean LoginAction
utilizando la definición del bean loginAction
para cada solicitud HTTP. Es decir, el bean loginAction
está dentro del alcance del nivel de solicitud HTTP. Puede cambiar el estado interno de la instancia creada tanto como desee, ya que otras instancias creadas a partir de la misma definición de bean loginAction
no ven estos cambios de estado. Dependen de la solicitud específica. Si la solicitud completa el procesamiento, el bean dentro del alcance de la solicitud se elimina.
Cuando se utilizan beans controlados por anotaciones o configuración Java, la anotación @RequestScope
se puede utilizar para asignar el alcance del bean a request
. El siguiente ejemplo muestra cómo hacer esto:
@RequestScope
@Component
public class LoginAction {
// ...
}
@RequestScope
@Component
class LoginAction {
// ...
}
Alcance de visibilidad dentro de una sesión
Considere la siguiente configuración XML para definir un bean:
<bean id="userPreferences" class="com.something.UserPreferences" alcance="session"/>
El contenedor Spring crea una nueva instancia del bean UserPreferences
utilizando la definición del bean userPreferences
durante la duración de una session
HTTP. En otras palabras, el bean userPreferences
tiene un alcance efectivo en el nivel HTTP Session
. Al igual que con los beans con ámbito de solicitud, puede modificar el estado interno de la instancia creada tanto como desee, sabiendo que otras instancias HTTP Session
que también usan instancias creadas en función de la misma definición de bean userPreferences
no notará estos cambios de estado porque pertenecen a una session
HTTP separada. Si una Session
HTTP termina siendo excluida, el bean que está vinculado a esa Session
HTTP en particular también se excluye.
Cuando utilice beans controlados por anotaciones o configuración de Java, puede utilizar la anotación @SessionScope
para asignar un alcance de bean a session
.
@SessionScope
@Component
public class UserPreferences {
// ...
}
@SessionScope
@Component
class UserPreferences {
// ...
}
Visibilidad dentro de la aplicación
Considere la siguiente configuración XML para definir un bean:
<bean id="appPreferences" class="com.something.AppPreferences" alcance="application"/>
El contenedor Spring crea una nueva instancia del bean AppPreferences
utilizando la definición del bean appPreferences
una vez para toda la aplicación web. Es decir, el bean appPreferences
está dentro del alcance del nivel ServletContext
y se almacena como un atributo ServletContext
normal. Es algo similar al bean singleton de Spring, pero se diferencia de él en dos aspectos importantes: es un objeto singleton para cada ServletContext
, en lugar de para Spring ApplicationContext
(que puede ser múltiple en cualquier aplicación web determinada) y realmente se abre, por lo que es visible como el atributo ServletContext
.
Cuando utilice beans controlados por anotaciones o configuración Java, puede utilizar la anotación @ApplicationScope
para asignar el alcance del bean a application
. El siguiente ejemplo muestra cómo hacer esto:
@ApplicationScope
@Component
public class AppPreferences {
// ...
}
@ApplicationScope
@Component
class AppPreferences {
// ...
}
Alcance de visibilidad dentro de WebSocket
El alcance de WebSocket está asociado con el ciclo de vida de una sesión de WebSocket y se aplica a aplicaciones STOMP sobre WebSocket.
GO TO FULL VERSION