← Назад к вопросам

Какой Scope Bean используется по умолчанию?

1.2 Junior🔥 171 комментариев
#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Scope Bean в Spring: Singleton по умолчанию

По умолчанию в Spring Framework используется singleton scope для бинов. Это означает, что контейнер создаёт единственный экземпляр бина при инициализации и переиспользует его во всё время жизни приложения.

Singleton Scope

Singleton — это наиболее частый scope, применяемый автоматически при отсутствии явного указания:

@Component
public class UserService {
    // Singleton scope по умолчанию
}

// Эквивалентно:
@Component
@Scope(BeanDefinition.SCOPE_SINGLETON)
public class UserService {
}

Почему Singleton по умолчанию?

  1. Экономия памяти — один экземпляр для всего приложения
  2. Производительность — нет overhead на создание/инициализацию
  3. Простота — удобнее для stateless компонентов
  4. Потокобезопасность — требует thread-safe реализации

Другие доступные Scopes

  • prototype — новый экземпляр для каждого запроса (используется редко)
  • request — новый бин на каждый HTTP запрос (только в web контексте)
  • session — один бин на HTTP сессию
  • application — один бин на ServletContext
  • websocket — один бин на WebSocket сессию

Примеры

// Singleton (по умолчанию)
@Component
public class DatabaseConnection {
    private Connection conn;
}

// Prototype
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class UserDTO {
    private String name;
}

// Request (web)
@Component
@Scope("request")
public class RequestContextHolder {
    private HttpServletRequest request;
}

Важное замечание

Singleton бины должны быть потокобезопасными, так как они используются из разных потоков одновременно. Избегайте хранения изменяемого состояния в singleton бинах — используйте immutable объекты или синхронизацию.

// ❌ Небезопасно
@Component
public class Counter {
    private int count; // Состояние будет race condition
}

// ✅ Безопасно
@Component
public class UserRepository {
    // Только dependency-функциональность, без состояния
    public User findById(Long id) { }
}

Для большинства stateless компонентов (сервисы, репозитории, утилиты) singleton — идеальный выбор по умолчанию.

Какой Scope Bean используется по умолчанию? | PrepBro