Управляет ли Spring полным жизненным циклом бина со scope=»prototype»?

«Управляет ли Spring полным жизненным циклом бина со scope=»prototype»?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, 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.