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