Ответ
Spring создает и инициализирует новый экземпляр бина при каждом запросе (например, через getBean() или инъекцию), но не управляет его полным жизненным циклом.
Ключевые отличия от singleton:
- Создание: Новый экземпляр на каждый запрос.
- Инициализация: Spring выполняет внедрение зависимостей и вызов методов обратного вызова (например,
@PostConstruct). - Уничтожение: Spring НЕ вызывает методы уничтожения (например,
@PreDestroyилиDisposableBean.destroy()). Ответственность за очистку ресурсов лежит на клиентском коде.
Пример объявления:
@Component
@Scope("prototype")
public class PrototypeBean {
// При каждом обращении к контексту будет создан новый объект
}
Когда использовать:
- Для stateful-бинов, состояние которых уникально для каждого использования (например, обработка отдельного HTTP-запроса в не-web контексте).
- Когда не использовать: Для stateless-компонентов из-за накладных расходов на постоянное создание объектов. Требует осторожности, если бин держит дорогие ресурсы (открытые соединения, файлы), так как их необходимо явно освобождать.