Dépendance circulaire
Définition: La dépendance circulaire est une référence circulaire, ce qui signifie que deux haricots ou plus se tiennent mutuellement, par exemple, CircularityA fait référence à CircularityB, CircularityB fait référence à CircularityC et CircularityC fait référence à CircularityA. Former une relation de référence circulaire.
Lorsque vous utilisez le ressort, si vous utilisez principalement la méthode d'injection de dépendance basée sur le constructeur, vous pouvez rencontrer des dépendances circulaires. En bref, le constructeur du haricot A dépend du haricot B, et le constructeur du haricot B dépend du haricot A. Dans ce cas, le printemps lancera un haricot, celle-ci enception au moment de la compilation.
Classe A
@ComponentPublic classa Classa {private classb classb; @Autowired public classa (classb classb) {this.classb = classb; } public void printClass () {System.out.println ("classe a =" + this); System.out.println ("classe b =" + classb); }}Classe B
@ComponentPublic class classb {private classa classa; @Autowired public classb (classa classa) {this.classa = classa; } public void printClass () {System.out.println ("class A =" + classa); System.out.println ("classe b =" + this); }}test
@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 (); }}raison
À l'heure actuelle, vous constaterez qu'une exception de congéion de la rérélation de la conduite est lancée. La raison en est que lorsque le printemps crée un haricot, il instanciera d'abord l'objet, puis injectera la dépendance. Supposons que le printemps crée la classe A d'abord, puis il constatera qu'il y a une dépendance de classe B dans le constructeur, il se tournera donc pour créer la classe B, puis trouver la dépendance à la classe A dans le constructeur de la classe B. Pour le moment, la classe A n'a pas été initialisée, donc elle se transformera pour créer la classe A, qui tombera dans une boucle morte.
Solution
Le passage à l'injection de dépendance basée sur le secteur peut résoudre ce problème. Étant donné que l'injection de dépendance basée sur le setter appellera d'abord le constructeur par défaut pour instancier l'objet, puis appelle le secteur pour implémenter l'injection de dépendance. De cette façon, il n'y a pas de dépendance dans l'étape d'instanciation de l'objet. Par conséquent, une fois que la classe A est instanciée, la classe B est appelée et une fois que la classe B est instanciée, elle commence à définir des valeurs. Pour le moment, la classe A est déjà instanciée, il peut donc se référer avec succès à la classe A.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.