In meiner App verwende ich eine User
-Bohne, die mit meinem Dienst MyService
automatisch verbunden ist und die als Hauptbenutzerinfo verwendet wird (der Benutzer kommt also nicht als statische Bean aus einem XML, sondern wird dynamisch generiert von einem angemeldeten Benutzer) Wenn zehn Benutzer eingeloggt sind, habe ich zehn Kandidaten für das Feld @AutoWired
User
. (richtig?) und ich kann einen von ihnen bekommen, weil AutoWired im Frühlingsbehälter und nicht Sitzung schaut.
Sag mir, wenn ich falsch liege. und wie man es wenn möglich löst. Was aber, wenn mein AutoWired-Feld mit @Scope ("Session")
So:
%Vor% %Vor% Ist es möglich, die User-Bean eines anderen Benutzers zu erhalten, wenn ich meine MyService
-Komponente aufruft? Cos MyService
ist nur @Component
, obwohl User
@Scope(session)
ist.
Grundsätzlich, (wenn ich falsch in meiner Annahme bin) denke ich, dass, wenn Sie ein Feld @Autowire
, es sieht in den Container als Ganzes und der Container ist nicht in Untercontainer pro Sitzung unterteilt.
Wenn Sie User
mit @Scope("session")
und dann @Autowire
mit einer anderen nicht-bereichsabhängigen Komponente annotieren, erzeugt Spring einen Proxy, der zwischen MyService
und User
liegt. Dieser Proxy sucht die User
der aktuellen Sitzung und delegiert alle Aufrufe von MyService
an den Proxy an die sitzungsspezifische User
.
Es ist vollkommen sicher, dass die MyService
-Komponente nur Zugriff auf User
von der aktuellen Sitzung hat.
Wenn die Proxy-Verarbeitung nicht stattgefunden hat, konnte der Container nicht gestartet werden, da Sie eine session-scope-Bean nicht direkt in eine single-scope Bean injizieren können.
Spring würde nicht automatisch einen Proxy erstellen. Sie müssen Ihre Bereichsanmerkung in das folgende
ändern %Vor%Dies würde sicherstellen, dass wenn die Session-Bean in einer Singleton-Klasse autowired wird, ein Proxy um die Bean herum erstellt wird, die dafür verantwortlich sein würde, die Bean aus der Session zu holen.
Tags und Links spring dependency-injection annotations autowired