Круговая зависимость
Определение: Круглая зависимость - это круговая ссылка, что означает, что два или более фасоль держат друг друга, например, Circularitya относится к циркулазности, CircularityB относится к циркулальности, а Circularityc относится к Circularitya. Сформировать круговые эталонные отношения.
При использовании Spring, если вы в основном используете метод инъекции зависимостей на основе конструктора, вы можете столкнуться с круглыми зависимостями. Короче говоря, конструктор Bean A зависит от бобов B, а конструктор Bean B зависит от Bean A. В данном случае весна бросит фасоль BeancurryincreationException во время компиляции.
Класс а
@Componentpublic class classa {private classb classb; @Autowired public classa (classb classb) {this.classb = classb; } public void printClass () {System.out.println ("class a =" + this); System.out.println ("class b =" + classb); }}Класс б
@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 ("class b =" + this); }}тест
@ContextConfiguration (Classe = {classa.class, classb.class}) @runwith (springrunner.class) открытый класс mytest {@autowired private classa classa; @Autowired private classb classb; @Test public void name () {classa.printclass (); classb.printclass (); }}причина
В настоящее время вы обнаружите, что исключение BeancurryIncreationException. Причина этого заключается в том, что когда Spring создаст боб, он сначала создаст экземпляр объекта, а затем введет зависимость. Предположим, что Spring создает сначала класс A, тогда он обнаружит, что в конструкторе есть зависимость класса B, поэтому он превратится в создание класса B, а затем найдет зависимость от класса A в конструкторе класса B. В настоящее время класс A не был инициализирован, поэтому он превратится в создание класса A, который попадет в мертвую петлю.
Решение
Переход на инъекцию зависимости на основе сеттера может решить эту проблему. Поскольку впрыск зависимостей на основе сеттера сначала вызовет конструктор по умолчанию, чтобы создать экземпляр объекта, а затем вызовов для реализации впрыскивания зависимости. Таким образом, нет никакой зависимости на стадии экземпляров объекта. Следовательно, после создания класса А, называется класс B, и после создания класса B он начинает устанавливать значения. В настоящее время класс A уже создан экземпляр, поэтому он может успешно относиться к классу A.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.