Ámbito confusión con respecto a los beans de sesión, proxies, y únicos en un resorte 3 gestionado aplicación JSF

StackOverflow https://stackoverflow.com/questions/4651782

Pregunta

Esto parece que es básico cosas Primavera 101, pero me parece que no puede encontrar el correcta manera de hacer esto. La situación es la siguiente; en mi aplicación web hay un solo punto de entrada que es un controlador que los usuarios manijas procedente de un sistema externo. La transferencia es sólo una solicitud POST con un montón de información asociada perteneciente a ese usuario. Apon entrada, tengo que crear un nuevo bean de usuario y cargarlo con esa información a los usuarios. Además, cuando el usuario pulsa una vista que desencadena algún servicio, lo que necesito para ese servicio para poder acceder a la instancia del bean de usuario correspondiente.

La primera manera de hacer esto que se le ocurrió fue tener un servicio UserManager lo que crearía una nueva instancia de usuario, llenarlo w / datos, y luego registrarlo en el contenedor de primavera con el nombre de usuario como el nombre del bean. Luego, cuando se invoca un servicio, el servicio podría hacer algo como Factory.getBean(username) para encontrar la instancia User apropiado. El problema que veo aquí es que estoy perdiendo el enlace entre el usuario y el cual frijol User que les pertenece. Además, me gustaría evitar que el usuario lleve el grano de vueltas en la sesión si es posible. Es aquí donde se supone que debo estar utilizando Spring AOP y proxies?

¿Cuál es el patrón típico de primavera para resolver este tipo de situaciones?

¿Fue útil?

Solución

Así que ahora es muchas semanas más tarde (ya que esta pregunta), y por lo tanto mi nivel de conocimiento ha estado expandiendo de manera exponencial, por lo que pensé que también podría responder a mi pregunta para cualquiera que pudiera resultar útil (por no hablar de la cuestión no estaba muy claro para empezar).

La respuesta básica es: proxies de uso. Dado un conjunto unitario es sólo una instancia 1 vez, no puedes inyecta otra clase que tiene una vida útil más corta, por ejemplo. ámbito de sesión. Para aquellos que necesitan más información, comprobación de estado contra los granos sin estado. Más o menos lo que terminó haciendo es esto ... los servicios contienen código STATELESS para la manipulación de datos (piensa verbos; RegisterUserSvc, AddPartSvc, etc). Los datos que manipulan estos servicios es con estado. Por ejemplo, cada usuario tiene una copia propia de su propio objeto de datos, digamos TodoListBean, que está en un estado diferente para cada usuario.

Entonces, ¿cómo un servicio, AddTodoItemService por ejemplo, manipular estos datos? Aquí es donde el proxy entra en juego. Cuando instanciado, el AddTodoItemService se inyecta con un proxy para el TodoListBean, en lugar del objeto real. De esta forma cuando las necesidades de servicio para acceder a la TodoListBean el recipiente servirá hasta la una TodoListBean fuera de la sesión de los usuarios actuales, y por lo tanto el servicio estará operando en el frijol correcta (en base a los cuales el usuario invoca el servicio), en lugar de hacer algo tonto como tener numerosas copias del servicio que se incluye en cada ámbito de sesión de usuarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top