Что такое scope prototype в Spring и когда его используют?

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

Ответ

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

Отличие от singleton (по умолчанию):

  • Singleton: Один экземпляр на весь контекст приложения.
  • Prototype: Новый экземпляр при каждом обращении.

Как объявить:

@Component
@Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeService {
    private String id = UUID.randomUUID().toString();
    public String getId() { return id; }
}

Когда использовать Prototype Scope:

  1. Состояние (Stateful): Когда бин хранит изменяемое состояние, специфичное для отдельного запроса или операции.
  2. Потокобезопасность: Чтобы избежать проблем с параллелизмом, если бин не является потокобезопасным.
  3. Дорогое создание, легкое использование: Если создание объекта недорогое, но его нельзя использовать повторно (например, объект-обертка для короткоживущих данных).

Важное замечание о внедрении в Singleton: При инъекции prototype-бина в singleton-бин, singleton получит один экземпляр prototype-бина при своей инициализации. Чтобы каждый вызов метода singleton возвращал новый prototype, используйте проксирование:

@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)

Или инжектируйте ObjectProvider<PrototypeService>.

Недостаток: Увеличивает нагрузку на сборщик мусора, так как создается много короткоживущих объектов.