Какой scope используется для бинов в Spring по умолчанию?

Ответ

Ответ идентичен вопросу с ID 8955, так как оба вопроса заданы одинаково.

По умолчанию в Spring Framework все бины имеют scope singleton.

Что это означает:

  • Контейнер Spring IoC создаёт ровно один экземпляр этого бина.
  • Все запросы и инъекции этого бина получают один и тот же общий объект.

Пример и особенности:

@Component // Или @Service, @Repository, @Bean в конфигурации
public class DefaultService {
    // Этот бин будет singleton
}

Важные аспекты singleton scope:

  1. Время жизни: Создаётся при инициализации контекста (если не @Lazy) и живёт до его уничтожения.
  2. Потокобезопасность: Не является потокобезопасным по умолчанию. Разработчик должен самостоятельно обеспечить синхронизацию, если бин используется в многопоточной среде (например, в веб-приложении).
  3. Производительность: Самый эффективный scope с точки зрения памяти и производительности.

Для использования других областей видимости (например, prototype, request, session) аннотацию @Scope необходимо указывать явно.

Ответ 18+ 🔞

Да ты посмотри, какая история-то простая, а как её раздувают, блядь! Ну слушай сюда, сейчас разжую.

Вот представь: у тебя есть контейнер Spring, такой большой, блядь, склад. И ты говоришь ему: «Слушай, сделай мне вот этот сервис, DefaultService». А он тебе в ответ: «Окей, чувак, будет тебе один экземпляр, и на всех хватит!». Это и есть singleton, ёпта. По умолчанию, блядь, все бины так и живут — как одинокая водка на всю тусовку.

Что это на практике значит, блядь?

  • Создаётся один раз и на всю катушку. Не два, не три, а один, сука!
  • Все, кто его просит — от контроллеров до других сервисов — получают один и тот же, блядь, объект. Как последнюю пачку сигарет на роте передают.

Вот смотри, как это выглядит в коде, тут всё просто:

@Component // Или @Service, @Repository, @Bean в конфигурации
public class DefaultService {
    // Этот бин будет singleton, даже не сомневайся
}

А теперь подводные, блядь, камни, о которые все расшибаются:

  1. Живёт долго, счастливо и до конца. Рождается, когда контекст Spring'а просыпается, и отправляется на тот свет, только когда весь контекст закрывают. Если, конечно, не повесили на него @Lazy — тогда он будет валяться на диване, пока его впервые не позовут.
  2. Потокобезопасность? А хуй там! Это самое важное, ёбта! Все думают: «О, один объект на всех, как удобно!». А потом приходит 1000 пользователей одновременно, начинают в него тыкать, менять его поля, и — пиздец, приложение падает или данные ебёт. По умолчанию он не потокобезопасный! Если внутри есть какое-то состояние, которое меняется — вся ответственность за синхронизацию лежит на тебе, чувак. Сам думай, где synchronized ставить или ThreadLocal использовать.
  3. Зато быстрый и экономный. С точки зрения памяти и скорости — это топ, хуй с горы. Создали один раз и забыли.

Если тебе нужна другая жизнь — чтобы каждый раз новый объект (prototype), или на каждый HTTP-запрос свой (request), — тогда надо кричать громче и явно ставить аннотацию @Scope. А так — живут все в режиме «один за всех, и все, блядь, за одного».