Для чего используется scope prototype в Spring?

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

Ответ

Scope prototype в Spring указывает контейнеру создавать новый экземпляр бина при каждом запросе (через getBean() или инъекцию), в отличие от scope singleton, который предоставляет один общий экземпляр на весь контекст.

Зачем это нужно:

  • Для хранения состояния, уникального для отдельного клиента (например, данные пользовательской сессии в веб-запросе).
  • Когда бин не является потокобезопасным и должен быть изолирован.
  • Чтобы избежать побочных эффектов от изменений состояния бина в разных частях приложения.

Пример объявления:

@Component
@Scope("prototype")
public class PrototypeScopedBean {
    private String requestId;
    // Геттер и сеттер
}

Важно:

  • Полный жизненный цикл prototype-бина (включая уничтожение) лежит на ответственности клиентского кода, Spring не управляет им после создания и инъекции.
  • При инъекции prototype-бина в singleton-бин необходимо использовать проксирование (@Scope(scopeName = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)) или lookup-метод, чтобы гарантировать получение нового экземпляра при каждом обращении.