Ответ
По умолчанию Spring создаёт ровно один экземпляр бина с областью видимости (scope) "singleton" в рамках одного контейнера ApplicationContext. Это самый распространённый scope.
Ключевые моменты:
-
Один контейнер — один бин:
@Service // По умолчанию scope="singleton" public class UserService { // В рамках одного ApplicationContext будет создан только один экземпляр UserService } -
Несколько контейнеров: Если в приложении создано несколько независимых контекстов (
ApplicationContext), в каждом будет свой singleton-экземпляр этого бина. -
Альтернативные области видимости:
prototype: Создаёт новый экземпляр при каждом запросе (черезcontext.getBean()или инъекцию).@Scope("prototype") @Component public class PrototypeBean { ... }request,session,application: Доступны в веб-приложениях (Spring MVC).
-
Потокобезопасность: Поскольку singleton-бин разделяется между всеми потоками, его состояние должно быть спроектировано как потокобезопасное (stateless или с надлежащей синхронизацией).
-
Lazy-инициализация: Singleton-бин по умолчанию создаётся при старте контекста. Аннотация
@Lazyоткладывает создание до первого обращения.