tgoop.com/Java_Iibrary/1285
Last Update:
Что такое циклическая зависимость и как её следует решать?
Когда beanA
зависит от beanB
, а beanB
зависит от beanA
, возникает циклическая зависимость. В этом случае оба бина пытаются внедрить друг друга через конструктор, и Spring выбрасывает исключение BeanCurrentlyInCreationException
Циклическая зависимость может возникать и между более чем двумя бинами, например:
beanA => beanB => beanC => beanD => beanA
Spring создаёт бины в том порядке, в котором они требуются. Если бин имеет зависимость, то сначала создаётся зависимость, а затем она внедряется для завершения создания бина.
В случае циклической зависимости Spring не может определить, какой бин создать первым.
Проблема циклической зависимости возникает при использовании конструкторной инъекции, так как бины создаются при загрузке контекста. При использовании setter-инъекции или инъекции в поле бины создаются, но их зависимости внедряются только по мере необходимости.
Таким образом, можно избежать проблемы циклической зависимости.
При использовании конструкторной инъекции можно применить аннотацию @Lazy
. Это сообщает Spring, что при инициализации бина нужно внедрить прокси. Сам бин будет полностью создан только тогда, когда он действительно понадобится.