Wenn eine Konstruktorinjektion verwendet wird, kann ein zirkuläres Abhängigkeitsszenario erstellt werden, das nicht analysiert werden kann.
Was ist kreisförmige Abhängigkeit
Die kreisförmige Abhängigkeit ist tatsächlich eine kreisförmige Referenz, dh zwei oder mehr Bohnen halten sich gegenseitig und bilden schließlich eine geschlossene Schleife. Beispielsweise hängt A von b, b ab C von C ab und C hängt von A ab. Wie in der folgenden Abbildung gezeigt:
Beachten Sie, dass dies kein Schleifenaufruf in die Funktion ist, sondern eine gegenseitige Abhängigkeit des Objekts. Loop -Anrufe sind tatsächlich eine tote Schleife, es sei denn, es gibt eine Endbedingung.
Es gibt Schleifenabhängigkeitsszenarien im Frühjahr:
(1) kreisförmige Abhängigkeit des Konstruktors (2) kreisförmige Abhängigkeit des Feldattributs.
So erkennen Sie, ob es eine kreisförmige Abhängigkeit gibt
Es ist relativ einfach, kreisförmige Abhängigkeiten zu erkennen. Wenn die Bohne erstellt wird, kann sie die Bohne markieren. Wenn der rekursive Anruf zurück ist und feststellt, dass er erstellt wird, bedeutet dies, dass die kreisförmige Abhängigkeit ist.
Hier ist die Situation, die ich begegnet bin, die Codestruktur lautet wie folgt:
SPRINGECURITY -Konfigurationsklasse:
@ConfigurationPublic Class BrowserSecurityConfig erweitert WebSecurityConFigurerAdapter {private endgültige BenutzerdetailsService UserDetailsService; / ** * Injize UserDetailsService durch den Konfigurationsklassenkonstruktor */ @autowired Public BrowserSecurityConfig (UserDetailsService UserDetailsService) {this.userDetailsService = userdetailsService; } / ** * deklarieren Sie den Verschlüsselungscodierer in der Konfigurationsklasse * / @Bean public passwayCoder passwordcoder () {Neue bcryptPasswordEnCoder () zurückgeben; } ... ...}UserDetailsService -Klasse:
@ComponentPublic Class MyUSerDetailService implementiert UserDetailsService {private endgültige PasswordEnCoder PasswordEnCoder; private logger logger = loggerFactory.getLogger (getClass ()); / ** * KennwortEntiere durch den Konstruktor eingeben } ... ...}Nach dem Laufen bringt Spring die folgende Fehlermeldung aus:
Beschreibung:
Die Abhängigkeiten einiger Bohnen im Anwendungskontext bilden einen Zyklus:
┌─inger
| BrowserSecurityConfig definiert in der Datei [d: /code/java/ideaprojects/mango-security/mango-security-browser/target/classeses/stu/mango/security/browsereSecurityconfig.class]
↑ ↓
| MyUserDetailService in der Datei definiert [d: /code/java/ideaprojects/mango-security/mango-security-browser/target/classeses/stu/mango/security/browser/myuserDetailservice.class]
└─inger
In diesem Beispiel injiziert BrowserSecurityConfig die BenutzerdetailsService -Instanz durch den Konstruktor, und der BenutzerdetailsService wird in den im browserecurityconfig über den Konstruktor deklarierten PasswortEntocoder injiziert.
Zusammenfassend bedeutet die kreisförmige Abhängigkeit der Frühlingsbohne, dass die Klasse A eine Instanz der Klasse B (oder eine in b) in den Konstrukteur deklarierte Bohne in den Griff bekommen muss, während die Klasse B eine Instanz der Klasse A (oder eine in A) in A deklarierte Bohne in den Konstruktor injizieren muss. Wenn die Bohnen der Klasse A und der Klasse B so konfiguriert sind, dass sie sich gegenseitig injizieren, erkennt der Feder -IOC -Container diese Schleifenreferenz zur Laufzeit und erhöht eine beruhigende Ausnahme. Im Gegensatz zu dem typischen Fall (ohne kreisförmige Abhängigkeiten) erzwingt die kreisförmige Abhängigkeit zwischen Bohnen A und Bohnen B eine der Bohnen, die vor dem vollständig initialisierten Initialisierungen in die andere injiziert werden (dies ist ein typisches "Huhn First- oder Ei First" -Szenario).
Lösung
Um es einfach auszudrücken, es ist keine Konstruktor-basierte Abhängigkeitsinjektion zu verwenden. Es kann durch die folgende Methode gelöst werden.
Verwenden Sie die @autowired Annotation auf dem Feld und lassen Sie die Frühling entscheiden, zur richtigen Zeit einzubringen. 【empfehlen】
Ersetzen Sie die Konstruktor-basierte Abhängigkeitsinjektion durch setzterbasierte Abhängigkeitsinjektion, um die kreisförmige Abhängigkeit zu lösen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.