Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
Контейнер создаёт singleton один раз и в этот момент разрешает его зависимости. Prototype-бин создаётся для внедрения, и дальше singleton держит именно этот экземпляр.
@Service
class ReportService {
private final ObjectProvider<ReportBuilder> builders;
ReportService(ObjectProvider<ReportBuilder> builders) { this.builders = builders; }
Report build(Data data) {
return builders.getObject().from(data).build(); // новый экземпляр
}
}Альтернативы: метод с @Lookup, который Spring переопределит, или @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS): прокси создаёт новый экземпляр на каждый вызов метода.
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Кто вызывает методы уничтожения prototype-бинов?
Ответ уровня Middle
Никто: контейнер создаёт и настраивает prototype, но дальше не управляет им. Освобождать ресурсы должен тот, кто получил экземпляр.
Типичные ошибки
- Ждать новый экземпляр prototype при каждом обращении к полю singleton.
- Хранить состояние запроса в singleton-бине.
Первоисточники
Быстрые задания по теме
Для темы «Жизненный цикл бина» быстрых заданий пока нет
Можно проверить всю зону «Spring» тестом на 10 минут.
Проверить себя за 10 минут