Ответ
Нет, Spring управляет только фазой создания и инициализации prototype-бина, но не его уничтожением.
Управление жизненным циклом для prototype:
- Вызываются: методы инициализации (
@PostConstruct,InitializingBean.afterPropertiesSet()). - Не вызываются: методы уничтожения (
@PreDestroy,DisposableBean.destroy()), так как Spring не отслеживает экземпляры после их возврата клиенту.
Почему? Scope prototype означает, что Spring создает новый экземпляр при каждом запросе (инъекции или вызове getBean()). Контейнер не хранит ссылки на эти экземпляры, поэтому не может управлять их завершением. Ответственность за очистку ресурсов лежит на клиентском коде.
Пример:
@Component
@Scope("prototype")
public class PrototypeService {
@PostConstruct
public void init() {
System.out.println("Prototype bean created and initialized."); // Выполнится
}
@PreDestroy
public void cleanup() {
System.out.println("This will NEVER be called by Spring."); // Не выполнится
}
}
Best Practice: Для prototype-бинов, требующих очистки (например, открывающих файлы или сетевые соединения), реализуйте кастомный метод (например, close()) и явно вызывайте его в клиентском коде или используйте try-with-resources.