Бин объявлен со scope prototype и содержит @PreDestroy. Когда контейнер вызовет этот метод?
- Вызывается ли @PreDestroy у prototype-бина?
Никогда: контейнер создаёт prototype-бин, отдаёт и забывает о нём — destroy-колбэки не вызываются. Освобождение ресурсов — забота вызывающего кода.
- Для singleton @PreDestroy вызывается при закрытии контекста
- Prototype с ресурсами — реализовать AutoCloseable и использовать try-with-resources
- Либо свой BeanPostProcessor, отслеживающий экземпляры (редко оправдано)
А ещё Request и session scope — колбэки вызываются при завершении запроса или сессии
Подробно
Для prototype Spring выполняет создание, внедрение зависимостей и инициализацию, после чего отдаёт объект клиенту и перестаёт его отслеживать — ссылки на такие бины контекст не хранит. Поэтому @PreDestroy и DisposableBean молчат, и если бин держит ресурс, его освобождение — забота вызывающего кода либо отдельного BeanPostProcessor. Отсюда же практический вывод: prototype-бины с внешними ресурсами — плохая идея. Сюда же примыкает вторая классическая ловушка scope: prototype, внедрённый в singleton, создаётся ровно один раз, и для получения нового экземпляра нужен ObjectProvider или method injection.
Что хотят услышать
- Что контейнер не управляет уничтожением prototype.
- Как освобождать ресурсы.
Частые ошибки
- Ожидать симметричного жизненного цикла у prototype и singleton.
- Хранить в prototype-бине незакрываемый ресурс.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗При завершении работы контекста, как и для singleton
- ✓Никогда: жизненный цикл prototype после создания не отслеживается
- ✗Сразу после того, как на бин не останется ссылок и его соберёт GC
- ✗После каждого вызова метода бина
Что спросят дальше
- Как получать новый prototype-экземпляр внутри singleton?
- Чем request-scope отличается от prototype?
Разбор темы
- Бины: жизненный цикл и scopes
Бин и BeanDefinition, полный жизненный цикл, роль BeanPostProcessor, области видимости и их ловушки.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.