Встречается на собеседованиях • сегодня

Почему не вызывается метод destroy у Bean со scope="prototype" в Spring

В Spring, бины с scope="prototype" не управляются контейнером полностью после их создания. Контейнер создаёт экземпляр, настраивает его и передаёт клиенту, но не отслеживает его дальнейший жизненный цикл. Поэтому методы destroy (например, @PreDestroy или DisposableBean.destroy()) не вызываются автоматически.

Решение:
Клиент, получивший prototype-бин, должен сам вызвать его уничтожение, если это необходимо. Например, через ConfigurableBeanFactory.destroyBean().

Пример:

java
@Scope("prototype")
@Component
public class PrototypeBean implements DisposableBean {
    @Override
    public void destroy() {
        System.out.println("Destroying prototype bean");
    }
}

// Использование:
@Autowired
private ConfigurableBeanFactory beanFactory;

public void usePrototypeBean() {
    PrototypeBean bean = beanFactory.getBean(PrototypeBean.class);
    // работа с бином
    beanFactory.destroyBean(bean); // явный вызов уничтожения
}
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы