Когда
beanA зависит от beanB, а beanB зависит от beanA, возникает циклическая зависимость. В этом случае оба бина пытаются внедрить друг друга через конструктор, и Spring выбрасывает исключение BeanCurrentlyInCreationException Циклическая зависимость может возникать и между более чем двумя бинами, например: 👇
beanA => beanB => beanC => beanD => beanA
Spring создаёт бины в том порядке, в котором они требуются. Если бин имеет зависимость, то сначала создаётся зависимость, а затем она внедряется для завершения создания бина.
В случае циклической зависимости Spring не может определить, какой бин создать первым.
Проблема циклической зависимости возникает при использовании конструкторной инъекции, так как бины создаются при загрузке контекста. При использовании setter-инъекции или инъекции в поле бины создаются, но их зависимости внедряются только по мере необходимости.
Таким образом, можно избежать проблемы циклической зависимости. ☺️
При использовании конструкторной инъекции можно применить аннотацию
@Lazy. Это сообщает Spring, что при инициализации бина нужно внедрить прокси. Сам бин будет полностью создан только тогда, когда он действительно понадобится.👉 Java Portal
