В чем разница между областями видимости Singleton и Prototype в Spring?

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

Ответ

Singleton и Prototype — это две основные области видимости (scopes) бинов в Spring, определяющие их жизненный цикл и количество экземпляров.

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

  • Один экземпляр на весь контекст приложения (ApplicationContext).
  • Создается при инициализации контекста (если не указана ленивая инициализация @Lazy).
  • Все запросы к этому бину получают один и тот же объект.
  • Контейнер управляет его уничтожением при закрытии контекста.
@Component
@Scope("singleton") // Аннотацию можно опустить, так как это область по умолчанию
public class SingletonService {
    // ...
}

Prototype

  • Новый экземпляр при каждом запросе (через getBean() или инъекцию зависимости).
  • Контейнер не управляет полным жизненным циклом созданного экземпляра после его создания и передачи клиенту (не вызывает методы уничтожения).
  • Подходит для stateful-бинов, состояние которых должно быть уникальным для каждого использования.
@Component
@Scope("prototype")
public class PrototypeService {
    // ...
}

Ключевые отличия

Критерий Singleton Prototype
Количество экземпляров Один на контекст Новый при каждом запросе
Время создания При старте контекста (или при первом запросе, если @Lazy) При каждом запросе
Управление жизненным циклом Полное (инициализация, уничтожение) Только инициализация
Использование памяти Эффективно Менее эффективно при частых запросах

Важное замечание: При инъекции prototype-бина в singleton-бин необходимо использовать проксирование (@Scope(scopeName = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)), иначе prototype-бин будет инжектирован только один раз при создании singleton-а.