Ответ
Scope prototype — это область видимости бина в Spring, при которой контейнер IoC создает новый экземпляр бина при каждом запросе (через getBean() или инъекцию зависимости).
Отличие от singleton (по умолчанию):
- Singleton: Один экземпляр на весь контекст приложения.
- Prototype: Новый экземпляр при каждом обращении.
Как объявить:
@Component
@Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeService {
private String id = UUID.randomUUID().toString();
public String getId() { return id; }
}
Когда использовать Prototype Scope:
- Состояние (Stateful): Когда бин хранит изменяемое состояние, специфичное для отдельного запроса или операции.
- Потокобезопасность: Чтобы избежать проблем с параллелизмом, если бин не является потокобезопасным.
- Дорогое создание, легкое использование: Если создание объекта недорогое, но его нельзя использовать повторно (например, объект-обертка для короткоживущих данных).
Важное замечание о внедрении в Singleton: При инъекции prototype-бина в singleton-бин, singleton получит один экземпляр prototype-бина при своей инициализации. Чтобы каждый вызов метода singleton возвращал новый prototype, используйте проксирование:
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
Или инжектируйте ObjectProvider<PrototypeService>.
Недостаток: Увеличивает нагрузку на сборщик мусора, так как создается много короткоживущих объектов.