Ответ
Singleton и Prototype — это две основные области видимости (scopes) бинов в Spring, определяющие их жизненный цикл и количество экземпляров.
Singleton (по умолчанию)
- Один экземпляр на весь контекст приложения (ApplicationContext).
- Создается при инициализации контекста (если не указана ленивая инициализация
@Lazy). - Все запросы к этому бину получают один и тот же объект.
- Контейнер управляет его уничтожением при закрытии контекста.
@Component
@Scope("singleton") // Аннотацию можно опустить, так как это область по умолчанию
public class SingletonService {
// ...
}
Prototype
- Новый экземпляр при каждом запросе (через
getBean()или инъекцию зависимости). - Контейнер не управляет полным жизненным циклом созданного экземпляра после его создания и передачи клиенту (не вызывает методы уничтожения).
- Подходит для stateful-бинов, состояние которых должно быть уникальным для каждого использования.
@Component
@Scope("prototype")
public class PrototypeService {
// ...
}
Ключевые отличия
| Критерий | Singleton | Prototype |
|---|---|---|
| Количество экземпляров | Один на контекст | Новый при каждом запросе |
| Время создания | При старте контекста (или при первом запросе, если @Lazy) |
При каждом запросе |
| Управление жизненным циклом | Полное (инициализация, уничтожение) | Только инициализация |
| Использование памяти | Эффективно | Менее эффективно при частых запросах |
Важное замечание: При инъекции prototype-бина в singleton-бин необходимо использовать проксирование (@Scope(scopeName = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)), иначе prototype-бин будет инжектирован только один раз при создании singleton-а.