Получить доступ

Бин объявлен со scope prototype и содержит @PreDestroy. Когда контейнер вызовет этот метод?

MiddleБины и их жизненный циклSpring
Ещё спрашивают так:
  • Вызывается ли @PreDestroy у prototype-бина?
Коротко

Никогда: контейнер создаёт prototype-бин, отдаёт и забывает о нём — destroy-колбэки не вызываются. Освобождение ресурсов — забота вызывающего кода.

  • Для singleton @PreDestroy вызывается при закрытии контекста
  • Prototype с ресурсами — реализовать AutoCloseable и использовать try-with-resources
  • Либо свой BeanPostProcessor, отслеживающий экземпляры (редко оправдано)

А ещё Request и session scope — колбэки вызываются при завершении запроса или сессии

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Для prototype Spring выполняет создание, внедрение зависимостей и инициализацию, после чего отдаёт объект клиенту и перестаёт его отслеживать — ссылки на такие бины контекст не хранит. Поэтому @PreDestroy и DisposableBean молчат, и если бин держит ресурс, его освобождение — забота вызывающего кода либо отдельного BeanPostProcessor. Отсюда же практический вывод: prototype-бины с внешними ресурсами — плохая идея. Сюда же примыкает вторая классическая ловушка scope: prototype, внедрённый в singleton, создаётся ровно один раз, и для получения нового экземпляра нужен ObjectProvider или method injection.

Что хотят услышать

  • Что контейнер не управляет уничтожением prototype.
  • Как освобождать ресурсы.

Частые ошибки

  • Ожидать симметричного жизненного цикла у prototype и singleton.
  • Хранить в prototype-бине незакрываемый ресурс.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Никогда: для prototype контейнер не отслеживает жизненный цикл после создания — освобождение ресурсов на стороне клиента
  • ✗При завершении работы контекста, как и для singleton
  • ✗Сразу после того, как на бин не останется ссылок
  • ✗После каждого вызова метода бина

Что спросят дальше

  • Как получать новый prototype-экземпляр внутри singleton?
  • Чем request-scope отличается от prototype?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем