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

Ответ

По умолчанию в 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! Ну, по умолчанию-то там всё просто, как три копейки, но дохуя важное.

В общем, если ты не указал ничего специального, то каждый твой бин — это синглтон, ёпта. Что это значит на практике? А то, что Spring, этот хитрожопый контейнер, создаёт один-единственный экземпляр твоего класса на весь свой гребаный контекст. И все, кто его просит — через @Autowired или как-то ещё — получают в свои руки один и тот же, общий, засранный всеми объект.

Вот смотри, пример, тут всё ясно:

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

Всё, приехали. DefaultService теперь один на всех. А теперь давай разберём, что из этого вытекает, а то потом будешь волосы на жопе рвать.

Что важно помнить про синглтоны:

  1. Живёт долго, счастливо и до конца. Создаётся эта сущность, когда контекст поднимается (если, конечно, ты не пометил её ленивой сволочью @Lazy), и благополучно сдыхает, когда контекст закрывают. Как верный пёс, блядь.

  2. Потокобезопасность? Ха-ха, хуй там! Вот это, блядь, самый частый подводный ебучий камень. Spring тебе ни хуя не гарантирует, что с этим общим объектом можно работать из нескольких потоков одновременно. Если в твоём бине есть какое-то состояние (поля, которые меняются), и он крутится в веб-приложении, где запросы летят пачками — готовься к пиздецу. Данные перемешаются, состояние поплывёт. Синхронизировать — это твоя головная боль, а не Spring'а. Сам думай, где synchronized впендюрить, или ThreadLocal использовать, или вообще архитектуру пересмотреть.

  3. Зато быстрый и экономный. С точки зрения памяти и скорости — это овердохуища эффективно. Один раз создал — и все им пользуются. Не плодим сущностей, как говна за баней.

Ну а если тебе этот всеобщий общак не подходит — надо явно указывать другую область видимости через @Scope. Хочешь новый инстанс на каждый запрос (request)? Или на каждую сессию пользователя (session)? Или вообще чтобы каждый раз новый объект рождался (prototype)? Тогда говори прямо, не стесняйся. А то по умолчанию — welcome to the singleton club, чувак. Один за всех, и все ебут одного.