requestmapping mvc espaƱol ejemplo spring spring-mvc

mvc - Alcance de un Spring-Controller y sus variables de instancia



@requestmapping ejemplo (2)

Para responder a su primera pregunta: sí, los controladores Spring MVC son singleton por defecto. Un campo de objeto será compartido y visible para todas las solicitudes y todas las sesiones para siempre.

Sin embargo, sin ninguna sincronización, puede encontrarse con todo tipo de problemas de concurrencia (condiciones de carrera, visibilidad). Por lo tanto, su campo debe tener un modificador volatile (y private , por cierto) para evitar problemas de visibilidad.

De regreso a su pregunta principal: en Spring puede usar request- (ver 4.5.4.2 Solicitar alcance ) y beans con alcance de sesión (ver: 4.5.4.3 Session ). Puede inyectarlos a los controladores y cualquier otro botón (¡incluso singletons!), Pero Spring se asegura de que cada solicitud / sesión tenga una instancia independiente.

Lo único que hay que recordar cuando se inyectan beans de solicitud y de ámbito de sesión en singletons es envolverlos en un proxy con ámbito (ejemplo tomado de 4.5.4.5 beans con ámbito como dependencias ):

<!-- an HTTP Session-scoped bean exposed as a proxy --> <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> <!-- instructs the container to proxy the surrounding bean --> <aop:scoped-proxy/> </bean>

¿Todos los controladores están en Singletons Spring-MVC y se comparten entre diferentes sesiones y solicitudes?

Si es así, supongo que una variable de clase como

public String name;

sería el mismo para todas las solicitudes y sesiones? Entonces, si el usuario X realiza una solicitud y el name se establece en Paul , ¿el usuario Z también tiene a Paul como atributo?

En mi caso, NO deseo ese comportamiento, pero me pregunto si existe una OOP-way más fácil o más limpia para tener session / request-variables entonces session.getAttribute() / request.getAttribute()


Sí, los controladores en Spring-MVC son singletons. Entre varias solicitudes, la variable de clase se comparte y puede generar ambigüedad. Puede usar la anotación @Scope ("solicitud") encima de su controlador para evitar dicha ambigüedad.