Spring и паттерн Singleton
В мае я писала про групповой транс на собеседованиях при обсуждении SOLID. Люди на автомате обмениваются дежурными фразами, совершенно не вслушиваясь в суть. Сегодня расскажу ещё один пример.
Часто на собесах обсуждается паттерн Singleton примерно в таком ключе:
🤵♀️: Синглтон - это когда один экземпляр на приложение
💁: А пример привести можете, где он встречается?
🤵♀️: Ну, бины в спринге
💁: Ага, ок
Вроде логично. У бинов по умолчанию скоуп Singleton. Создаётся один экземпляр. Значит, бины по умолчанию синглтоны.
Но нет.
Суть паттерна Singleton не в том, что в приложении один экземпляр класса. А в том, что он гарантированно один, и никаким легальным способом в системе не может появиться ещё один экземпляр. Для этого проводится комплекс мер - конструктор становится приватным, доступ к объекту предоставляется только через метод. Плюс всякие приёмы для ленивой инициализации и thread-safe.
В случае спринга таких мер нет:
👯♀️ Можно создать 2 бина одного типа
👯♀️ Можно в любом месте сделать new
Scope Singleton означает лишь, что бин с таким id будет в контексте один. Но это не реализация паттерна Singleton.
———————————————
Фан факт для зумеров: слово "синглтон" активно использовалось в районе 2010, чтобы обозначить людей, которые живут одни и довольны этим. В газетах были статьи типа "Я - синглтон", а в новостях — сюжеты, что в России "расцветает синглтонство".