Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: spring, scope, lifecycle, prototype

Почему у prototype не вызывается @PreDestroy?

Вопрос проверяет понимание жизненного цикла бинов в Spring и различий между scope’ами.

Короткий ответ

Для бинов со scope prototype Spring не управляет полным жизненным циклом. Контейнер отвечает только за создание и внедрение зависимостей. Уничтожение prototype-бина находится на ответственности пользователя. Поэтому @PreDestroy для таких бинов не вызывается автоматически. Это ожидаемое поведение Spring.

Длинный ответ

Причина связана с архитектурой контейнера Spring и ответственностью за ресурсы.

Определение

Prototype scope — это scope, при котором новый экземпляр бина создаётся при каждом запросе из контейнера.

Как Spring управляет жизненным циклом

Spring по-разному работает с разными scope.

  1. Singleton

    • Создание

    • Инициализация

    • Уничтожение (@PreDestroy)

  2. Prototype

    • Только создание

    • Инициализация

    • Дальнейшая судьба неизвестна контейнеру

Почему @PreDestroy не вызывается

Spring не знает:

  • сколько живёт объект

  • кто и где его использует

  • когда он больше не нужен

Из-за этого:

  1. Контейнер не хранит ссылки на prototype-бины

  2. Не может отследить момент уничтожения

  3. Не вызывает @PreDestroy

Типичный пример проблемы

@Scope("prototype")
@Component
class ResourceHolder {

    @PreDestroy
    void close() {
        // не будет вызвано автоматически
    }
}

Как корректно освобождать ресурсы

Возможные подходы:

  1. Управлять жизненным циклом вручную

  2. Использовать DisposableBean явно

  3. Оборачивать prototype в singleton

  4. Использовать @Bean(destroyMethod = ...) при явном управлении

Вывод

Prototype-бин живёт вне контроля контейнера после создания. Поэтому освобождение ресурсов — ответственность кода, который его использует.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Spring

    Spring

Ключевые слова

#spring

#scope

#lifecycle

#prototype

Подпишись на Java Developer в телеграм