← Назад к вопросам
Какой 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 по умолчанию?
- Экономия памяти — один экземпляр для всего приложения
- Производительность — нет overhead на создание/инициализацию
- Простота — удобнее для stateless компонентов
- Потокобезопасность — требует 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 — идеальный выбор по умолчанию.