Ответ
Ответ идентичен вопросу с ID 8955, так как оба вопроса заданы одинаково.
По умолчанию в Spring Framework все бины имеют scope singleton.
Что это означает:
- Контейнер Spring IoC создаёт ровно один экземпляр этого бина.
- Все запросы и инъекции этого бина получают один и тот же общий объект.
Пример и особенности:
@Component // Или @Service, @Repository, @Bean в конфигурации
public class DefaultService {
// Этот бин будет singleton
}
Важные аспекты singleton scope:
- Время жизни: Создаётся при инициализации контекста (если не
@Lazy) и живёт до его уничтожения. - Потокобезопасность: Не является потокобезопасным по умолчанию. Разработчик должен самостоятельно обеспечить синхронизацию, если бин используется в многопоточной среде (например, в веб-приложении).
- Производительность: Самый эффективный scope с точки зрения памяти и производительности.
Для использования других областей видимости (например, prototype, request, session) аннотацию @Scope необходимо указывать явно.
Ответ 18+ 🔞
Да ты посмотри, какая история-то простая, а как её раздувают, блядь! Ну слушай сюда, сейчас разжую.
Вот представь: у тебя есть контейнер Spring, такой большой, блядь, склад. И ты говоришь ему: «Слушай, сделай мне вот этот сервис, DefaultService». А он тебе в ответ: «Окей, чувак, будет тебе один экземпляр, и на всех хватит!». Это и есть singleton, ёпта. По умолчанию, блядь, все бины так и живут — как одинокая водка на всю тусовку.
Что это на практике значит, блядь?
- Создаётся один раз и на всю катушку. Не два, не три, а один, сука!
- Все, кто его просит — от контроллеров до других сервисов — получают один и тот же, блядь, объект. Как последнюю пачку сигарет на роте передают.
Вот смотри, как это выглядит в коде, тут всё просто:
@Component // Или @Service, @Repository, @Bean в конфигурации
public class DefaultService {
// Этот бин будет singleton, даже не сомневайся
}
А теперь подводные, блядь, камни, о которые все расшибаются:
- Живёт долго, счастливо и до конца. Рождается, когда контекст Spring'а просыпается, и отправляется на тот свет, только когда весь контекст закрывают. Если, конечно, не повесили на него
@Lazy— тогда он будет валяться на диване, пока его впервые не позовут. - Потокобезопасность? А хуй там! Это самое важное, ёбта! Все думают: «О, один объект на всех, как удобно!». А потом приходит 1000 пользователей одновременно, начинают в него тыкать, менять его поля, и — пиздец, приложение падает или данные ебёт. По умолчанию он не потокобезопасный! Если внутри есть какое-то состояние, которое меняется — вся ответственность за синхронизацию лежит на тебе, чувак. Сам думай, где
synchronizedставить илиThreadLocalиспользовать. - Зато быстрый и экономный. С точки зрения памяти и скорости — это топ, хуй с горы. Создали один раз и забыли.
Если тебе нужна другая жизнь — чтобы каждый раз новый объект (prototype), или на каждый HTTP-запрос свой (request), — тогда надо кричать громче и явно ставить аннотацию @Scope. А так — живут все в режиме «один за всех, и все, блядь, за одного».