Жизненный цикл Bean

Базовый Spring
≈ 1 мин чтения

Bean проходит несколько этапов

Когда контейнеру нужен bean, работа не заканчивается вызовом конструктора. Spring создаёт объект, передаёт ему зависимости, выполняет этап инициализации, а при закрытии контекста может дать объекту возможность освободить ресурсы.

@Component
class CacheClient {

    @PostConstruct
    void connect() {
        System.out.println("connected");
    }

    @PreDestroy
    void disconnect() {
        System.out.println("disconnected");
    }
}

Метод с @PostConstruct вызывается после того, как объект создан и его зависимости уже установлены. Это подходящее место для инициализации, которой нужны готовые зависимости. @PreDestroy позволяет выполнить очистку перед уничтожением bean при нормальном закрытии контекста.

Упрощённая последовательность

  1. Spring создаёт экземпляр bean.
  2. Контейнер подставляет необходимые зависимости.
  3. Выполняются механизмы Spring, работающие вокруг инициализации.
  4. Запускаются инициализационные callbacks.
  5. Bean готов к обычной работе.
  6. При завершении контекста выполняются callbacks уничтожения.

Позже мы отдельно разберём механизм, который позволяет Spring вмешиваться в этапы до и после инициализации. Сейчас достаточно видеть главное: bean существует внутри управляемого контейнером жизненного цикла.

Конструктор — ещё не момент полной готовности bean. Если инициализация зависит от других beans, безопаснее выполнять её после того, как контейнер уже закончил внедрение зависимостей.