Solución:
- Utiliza beans de sesión de primavera para beans que tienen estado y su estado difiere según el usuario. Estas pueden ser, por ejemplo, las preferencias del usuario que ha iniciado sesión actualmente.
- El alcance predeterminado de bean en spring es singleton y no es diferente en el contexto de la aplicación web.
Tenga en cuenta que en el entorno web también puede usar los beans con ámbito REQUEST y su vida útil es solo por solicitud de un usuario. Debe usar el alcance de la solicitud cuando la sesión no es necesaria y la solicitud es suficiente.
Además, en el entorno de portlet, puede utilizar otro ámbito que es GLOBAL SESSION. Cada portlet tiene su propia sesión independiente y normalmente se prefiere que esos portlets tengan su propio estado encapsulado solo para ellos mismos. Pero si necesita compartir datos de sesión entre diferentes portlets, deberá utilizar el alcance de sesión global.
Respuesta 1) el alcance de la sesión es muy similar al alcance de HttpSession. Los beans instanciados basados en el alcance del alcance de la sesión viven a través de la sesión HTTP. Al igual que el alcance de la solicitud, solo se aplica a contextos de aplicaciones de primavera compatibles con la web.
/** * Annotation-based configuration of session scope */
@Component
@Scope("session")
public class ShopCart { }
y luego
@Inject
private ShopCart cart;
Respuesta 2) El valor predeterminado es Singleton en todas partes.
En realidad, Spring lo ayuda a crear un bean de alcance de sesión en lugar de la forma tradicional
httpSession.setAttribute("Object",new Object());
&&
httpSession.getAttribute("Object");
y Spring proporcionan esta forma eficiente
@Component
@Scope("session")
public class Foo{
}
ahora es un dolor de cabeza de primavera crear y destruir este objeto de sesión asociado usando Factory Pattern