Zirkularabhängigkeit
Definition: Zirkuläre Abhängigkeit ist eine kreisförmige Referenz, was bedeutet, dass zwei oder mehr Bohnen sich gegenseitig halten, z. B. Kreislaufheit bezieht sich auf CircularityB, CircularityB auf Zirkularität und Zirkularitätc bezieht sich auf Circularitya. Eine kreisförmige Referenzbeziehung bilden.
Wenn Sie bei der Verwendung der Feder die Konstruktor-basierte Abhängigkeitsinjektionsmethode hauptsächlich verwenden, können Sie kreisförmige Abhängigkeiten begegnen. Kurz gesagt, der Konstruktor der Bean A hängt von der Bean B ab, und der Konstruktor der Bean B hängt von Bean A ab.
Klasse a
@ComponentPublic Classa {private classB classB; @Autowired public classa (classB classB) {this.classB = classB; } public void printClass () {System.out.println ("Klasse A =" + this); System.out.println ("Klasse B =" + classB); }}Klasse b
@ComponentPublic ClassB {private classa classa; @Autowired public classB (classa classa) {this.classa = classa; } public void printClass () {System.out.println ("Klasse a =" + classa); System.out.println ("Klasse B =" + this); }}prüfen
@ContextConfiguration (classes = {classa.class, classb.class}) @runwith (Springrunner.class) public class myTest {@autowired private classa classa; @Autowired Private classb classB; @Test public void name () {classa.printclass (); classb.printclass (); }}Grund
Zu diesem Zeitpunkt werden Sie feststellen, dass eine Beankleber -Ausnahme ausgelöst wird. Der Grund dafür ist, dass beim Erstellen der Spring eine Bohne das Objekt zuerst instanziiert und dann die Abhängigkeit injiziert. Angenommen, Spring erstellt Klasse A zuerst, dann wird es feststellen, dass es eine Abhängigkeit der Klasse B im Konstruktor gibt, sodass es sich um die Erstellung von Klasse B dreht und dann die Abhängigkeit von der Klasse A im Konstruktor der Klasse B erstellt. Zu diesem Zeitpunkt wurde die Klasse A nicht initialisiert, sodass er in eine tote Schleife erstellt wird, die in eine tote Schleife fällt.
Lösung
Die Umstellung auf setzterbasierte Abhängigkeitsinjektion kann dieses Problem lösen. Da die setzerbasierte Abhängigkeitsinjektion zuerst den Standardkonstruktor aufruft, um das Objekt zu instanziieren, und dann Setter aufrufen, um die Abhängigkeitsinjektion zu implementieren. Auf diese Weise gibt es keine Abhängigkeit in der Instanziationsphase des Objekts. Daher wird nach der Instanziierung der Klasse A die Klasse B aufgerufen und nach dem Instanziieren der Klasse B beginnt es die Einstellungswerte. Zu diesem Zeitpunkt ist die Klasse A bereits instanziiert, sodass sie erfolgreich auf Klasse A verweisen kann.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.