Ответ
Нет, Spring не управляет полным жизненным циклом prototype-бина. Управление ограничивается фазами создания и настройки.
Жизненный цикл prototype-бина в Spring:
- Создание (Instantiation): Новый экземпляр создается при каждом запросе (через
ApplicationContext.getBean()или инъекцию зависимости). - Настройка (Population & Initialization): Spring внедряет зависимости и вызывает метод, помеченный аннотацией
@PostConstruct. - Уничтожение (Destruction): Spring НЕ вызывает метод
@PreDestroyдля prototype-бинов. Очистка ресурсов (закрытие соединений, файлов) и удаление из памяти — ответственность клиентского кода и JVM (сборщика мусора).
Почему так? Область prototype подразумевает, что Spring возвращает управление объектом клиенту сразу после его создания и настройки. Контейнер не отслеживает дальнейшую судьбу этих экземпляров.
Пример:
@Component
@Scope("prototype")
public class PrototypeService {
@PostConstruct
public void init() {
System.out.println("Prototype bean created and initialized.");
}
@PreDestroy
public void cleanup() {
// ЭТОТ МЕТОД НИКОГДА НЕ ВЫЗОВЕТСЯ SPRING'OM!
System.out.println("Это сообщение не появится.");
}
}
Для корректного освобождения ресурсов prototype-бинов необходимо использовать шаблоны вроде DisposableBean с явным вызовом метода уничтожения в клиентском коде.