Назад к вопросам
Aston
Junior — Middle
61
Объясните, что такое циклическая зависимость в контексте Spring и как ее избегать
Компании, где спрашивали
Surf
Ответ от нейросети
sobes.tech AI
Циклическая зависимость в Spring возникает, когда два или более бина зависят друг от друга напрямую или косвенно, создавая замкнутый круг. Например, бин A зависит от бина B, а бин B — от бина A.
Это приводит к ошибкам при создании контекста Spring, так как контейнер не может определить порядок инициализации.
Как избежать циклических зависимостей:
- Пересмотреть дизайн и разделить ответственность между классами.
- Использовать внедрение зависимостей через сеттеры (@Autowired на сеттере), чтобы Spring мог создать бины и потом установить зависимости.
- Применять интерфейсы и абстракции для разрыва циклов.
- Использовать аннотацию @Lazy для отложенной инициализации одного из бинов.
Пример с @Lazy:
@Component
public class A {
private final B b;
public A(@Lazy B b) {
this.b = b;
}
}
@Component
public class B {
private final A a;
public B(A a) {
this.a = a;
}
}
Здесь @Lazy позволяет Spring создать бин A без немедленного создания B, разрывая цикл.