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:

Java
@RequestScope
@Component
public class LoginAction {
    // ...
}
Kotlin
@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.

Java
@SessionScope
@Component
public class UserPreferences {
    // ...
}
Kotlin
@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:

Java
@ApplicationScope
@Component
public class AppPreferences {
    // ...
}
Kotlin
@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.