Ответ
Singleton и Prototype — это основные области видимости (scope) бинов в Spring, определяющие жизненный цикл экземпляра.
Singleton (по умолчанию)
- Контейнер создает только один экземпляр бина.
- Все запросы (инъекции, вызовы
getBean()) получают один и тот же объект. - Используется для stateless-компонентов: сервисы, репозитории, утилитные классы.
- Потокобезопасность: Бин не должен хранить изменяемое состояние, иначе возможны состояния гонки (race condition).
Prototype
- Контейнер создает новый экземпляр при каждом запросе.
- Каждая инъекция или вызов
getBean()возвращает новый объект. - Используется для stateful-компонентов: объекты с состоянием, специфичным для запроса (например, DTO, данные сессии пользователя).
- Управление памятью: Контейнер Spring не управляет полным жизненным циклом prototype-бина после его создания и передачи клиенту. Уничтожение — ответственность клиентского кода.
Пример объявления
// Singleton (явное указание избыточно, так как это scope по умолчанию)
@Component
@Scope("singleton") // или @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class OrderService { ... }
// Prototype
@Component
@Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ShoppingCart { ... }
Ключевой вывод: Выбор зависит от необходимости разделять состояние. Singleton — для общей логики, Prototype — для изолированных данных.