Все ли компоненты в вашем Spring Boot проекте были синглтонами?

«Все ли компоненты в вашем Spring Boot проекте были синглтонами?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не все. Хотя scope по умолчанию в Spring — singleton, для определенных сценариев использовались другие scopes.

1. Singleton (по умолчанию):

  • Применялся для: Stateless сервисов, репозиториев, утилитарных классов. Это безопасно и эффективно.
    @Service // По умолчанию scope="singleton"
    public class PaymentService {
    // Не содержит изменяемого состояния
    public Receipt process(PaymentRequest request) { ... }
    }

2. Prototype:

  • Применялся для: Бинов, которые хранят состояние в рамках одного запроса/операции и не должны использоваться повторно.
    @Component
    @Scope("prototype") // Новый бин при каждом внедрении (getBean() или инъекции)
    public class RequestContext {
    private final UUID requestId = UUID.randomUUID();
    // Состояние, уникальное для каждого запроса
    }

3. Request/Application/WebSocket Scope:

  • @RequestScope: Для хранения данных, актуальных только в рамках одного HTTP-запроса (например, аутентифицированный пользователь).
  • @ApplicationScope: Для кэширования данных, общих для всего приложения, но с возможностью пересоздания.

Архитектурное решение: Основная кодовая база (95%) состояла из stateless синглтонов для производительности. Scopes prototype и request применялись точечно для изоляции состояния, что предотвращало скрытые баги в многопоточной среде.