Sobes.tech
Назад к вопросам
Junior — Middle
61

Объясните, что такое циклическая зависимость в контексте Spring и как ее избегать

Компании, где спрашивали
Surf
AstonAston

Ответ от нейросети

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, разрывая цикл.