Ответ
Singleton является scope по умолчанию в Spring, потому что он оптимален для подавляющего большинства компонентов enterprise-приложений.
Причины выбора Singleton по умолчанию:
- Производительность: Создание и инициализация одного экземпляра на весь контекст приложения экономит память и CPU-время.
- Stateless-модель: Большинство сервисов, репозиториев и контроллеров не хранят состояние, связанное с конкретным запросом или пользователем. Один экземпляр может безопасно использоваться всеми потоками.
- Соответствие паттернам: Многие классические паттерны (Factory, Strategy) также предполагают использование объектов-одиночек.
Когда использовать Prototype scope? Только когда бин должен быть stateful и его состояние уникально для каждого места инъекции или запроса.
@Component
@Scope("prototype") // Явное указание необходимо
public class ShoppingCart {
private List<Item> items = new ArrayList<>();
// У каждого покупателя должна быть своя корзина
}
Важно: Необоснованное использование prototype увеличивает нагрузку на сборщик мусора и может привести к утечкам памяти, если бины не спроектированы корректно. Spring не управляет полным жизненным циклом prototype-бинов после их создания и передачи клиенту.