Сколько экземпляров бина со scope singleton создаст контейнер?
- Чем singleton Spring отличается от паттерна Singleton?
Один экземпляр на контекст — не на всю JVM, как классический паттерн. Два контекста — два экземпляра; можно создать объект класса и вручную через new.
- Общий для всех потоков — не хранить состояние запроса
- Создаётся при старте (если не @Lazy)
- Объявить два бина одного класса через @Bean — два «синглтона»
А ещё Это scope по умолчанию
Подробно
Различие с паттерном существенное: контейнерный синглтон ограничен контекстом, и если контекстов два, экземпляров тоже будет два. Кроме того, у него нет глобальной точки доступа — зависимость приходит через внедрение, поэтому подменить её в тесте легко. Практическое следствие, о котором нужно помнить всегда: раз экземпляр один на всех, изменяемое состояние в его полях становится общим для всех параллельных запросов, а это гонка.
Что хотят услышать
- Один на контекст.
- Отличие от паттерна и потокобезопасность.
Частые ошибки
- Хранить в полях бина данные текущего запроса.
- Отождествлять контейнерный singleton с классическим паттерном.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗По одному на каждый HTTP-запрос, обработанный приложением
- ✗По одному на каждое место внедрения, чтобы бины не делили состояние
- ✓Один на ApplicationContext — у всех одна и та же ссылка
- ✗Один на всю JVM, включая другие приложения, запущенные в ней
Что спросят дальше
- Чем prototype-scope отличается от singleton?
- Как безопасно хранить данные, относящиеся к запросу?
Разбор темы
- Контейнер: события, FactoryBean и тонкое связывание
События приложения и @EventListener, FactoryBean, Aware-интерфейсы, порядок бинов (@Order/@DependsOn) и отложенное получение (ObjectProvider/@Lazy/@Lookup).
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.