Scope Verwirrung in Bezug auf Session Beans, Proxies und Singletons in einem Frühling 3 verwaltet JSF App

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

Frage

Dies scheint, wie es einfache Spring 101 Sachen, aber ich kann nicht scheinen zu finden, die richtig Art und Weise, dies zu tun. Die Situation ist wie folgt; in meinem Web-App gibt es einen einzigen Eintrittspunkt, der einen Controller ist, dass Griffe Benutzer von einem externen System kommen. Die Übertragung ist nur ein POST Anfrage mit einem Bündel von zugeordneten Informationen zu diesem Benutzer gehören. Apon Eintrag, ich brauche einen neuen User-Bean erstellen und mit dieser Benutzer Informationen zu laden. Zusätzlich wird, wenn der Benutzer eine Ansicht trifft, die einen Dienst auslöst, muss ich für diesen Dienst die entsprechende Benutzer Bean-Instanz zugreifen können.

Der erste Weg, dies zu tun, dass in den Sinn kam, war ein Usermanager Dienst zu haben, die eine neue Instanz der Benutzer schaffen würde, füllen Sie es w / Daten, und es dann mit dem Benutzernamen als Bean Namen im Frühjahr Container registrieren. Dann, wenn ein Dienst aufgerufen wird, würde der Dienst etwas wie Factory.getBean(username) tun, um die entsprechende User Instanz zu finden. Das Problem, das ich hier sehe, ist, dass ich die Verbindung zwischen dem Benutzer bin zu verlieren & welche User Bohne gehört zu ihnen. Darüber hinaus würde ich den Benutzer die Bohne um in der Sitzung überhaupt möglich, wenn tragen zu vermeiden dergleichen. Ist das, wo soll ich werden mit Spring AOP & Proxies?

Was ist die typische Frühling Muster diese Art von Situation zu lösen?

War es hilfreich?

Lösung

So it is now many weeks later (since asking this question), and consequently my knowledge level has been expanding exponentially, so I figured I might as well answer my question for anyone who might find it helpful (not to mention the question wasn't very clear to begin with).

The basic answer is: use proxies. Since a singleton is only instantiate 1 time, you cant inject another class which has a shorter lifespan, eg. session scope. For those requiring more information, checkout stateful vs stateless beans. More or less what I ended up doing is this... the services contain STATELESS code for manipulating data (think verbs; RegisterUserSvc, AddPartSvc, etc). The data which these services manipulate is stateful. For instance, each user has a own copy of their own data object, lets say TodoListBean, which is in a different state for each user.

So how does a service, AddTodoItemService for instance, manipulate this data? This is where the proxy comes into play. When instantiated, the AddTodoItemService gets injected with a proxy for the TodoListBean, instead of the actual object. That way when the service needs to access the TodoListBean the container will serve up the a TodoListBean out of the current users session, and therefore the service will be operating on the correct bean (based on which user invoked the service), instead of doing something silly like having numerous copies of the service included in each users session scope.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top