Ich habe gelesen, dass ich, um zirkuläre Abhängigkeiten zu vermeiden, @Autowired
auf Setter anstelle von Konstruktoren verwenden kann.
Wenn ja, warum scheitert das?
%Vor% Wenn ich die A
-Klasse ähnlich wie B
definiere, ist alles in Ordnung, aber das obige sollte schon funktionieren, warum also nicht? Ich bin in einer Situation, in der ich die Abhängigkeit im Konstruktor von A
klasse nicht los werde. Was kann ich in diesem Fall tun?
BEARBEITEN: Ich benutze Spring 3.2.1.RELEASE
EDIT2: Meine Ausnahme:
%Vor%Ich denke, Spring ist einfach nicht clever genug, um zu erkennen, dass diese Art von Beziehung in einer bestimmten Reihenfolge geladen werden muss, um nicht wie ein unauflösbarer Zirkel zu erscheinen. Normalerweise behandelt sie zirkuläre Referenzen, indem sie Singleton-Instanzen nach dem Konstruieren zwischenspeichert, aber bevor sie vollständig gefüllt werden, damit sie die Instanz dort einfügen kann, wo sie benötigt wird, auch wenn sie noch nicht gefüllt ist, da sie weiß, dass sie später fertig gestellt wird.
Was passiert, ist, dass es versucht, das A zuerst zu erstellen, aber es kann nicht einmal ein B ohne B erstellen, so dass es keine A-Instanz zwischenspeichern kann. Dann versucht es ein B zu erstellen und sieht, dass es ein A benötigt, aber es weiß, dass es das A erstellt, aber keine zwischengespeicherte Instanz für die Abhängigkeit verwendet, daher schlägt es fehl. Sie müssen es erzwingen, die B-Instanz zuerst mit etwas wie @DependsOn("dependencyTest.B")
zu erstellen. Dann kann das Singleton-Caching stattfinden, da ein B ohne ein A erstellt werden kann, so dass die nicht besetzte B-Instanz verfügbar ist, wenn das A erstellt wird.
Die Bohnen werden zuerst instanziiert und dann ineinander injiziert. Deshalb sind Sie mit dieser Situation konfrontiert. Wenn A
instanziiert wird, benötigt es B
.
Das Verwenden von Setter anstelle von Konstruktoren würde dieses Problem lösen, da die Instanziierungsphase ohne Hinzufügen von Abhängigkeiten erfolgt.
Tags und Links spring circular-dependency