Ответ
Scope prototype в Spring указывает контейнеру создавать новый экземпляр бина при каждом запросе (через getBean() или инъекцию), в отличие от scope singleton, который предоставляет один общий экземпляр на весь контекст.
Зачем это нужно:
- Для хранения состояния, уникального для отдельного клиента (например, данные пользовательской сессии в веб-запросе).
- Когда бин не является потокобезопасным и должен быть изолирован.
- Чтобы избежать побочных эффектов от изменений состояния бина в разных частях приложения.
Пример объявления:
@Component
@Scope("prototype")
public class PrototypeScopedBean {
private String requestId;
// Геттер и сеттер
}
Важно:
- Полный жизненный цикл prototype-бина (включая уничтожение) лежит на ответственности клиентского кода, Spring не управляет им после создания и инъекции.
- При инъекции prototype-бина в singleton-бин необходимо использовать проксирование (
@Scope(scopeName = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)) или lookup-метод, чтобы гарантировать получение нового экземпляра при каждом обращении.