Вопрос проверяет понимание области видимости prototype в Spring, которая используется для создания нового экземпляра бина при каждом запросе.
В Spring Framework область видимости (scope) определяет жизненный цикл и видимость бина в контейнере. По умолчанию все бины имеют область singleton, что означает один экземпляр на контейнер. Prototype scope — это альтернатива, при которой Spring создаёт новый экземпляр объекта каждый раз, когда требуется этот бин.
Когда вы запрашиваете бин с областью prototype (например, через applicationContext.getBean() или при внедрении зависимости), контейнер Spring инициирует процесс создания нового экземпляра. Это включает вызов конструктора, внедрение зависимостей и вызов методов инициализации, если они определены. Контейнер не управляет полным жизненным циклом prototype-бинов — после создания и передачи клиенту контейнер больше не отслеживает их, и методы уничтожения не вызываются автоматически.
Prototype scope можно задать аннотацией @Scope или через XML-конфигурацию. Рассмотрим пример с аннотациями:
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("prototype")
public class PrototypeService {
private String data;
public void setData(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
// В другом компоненте
@Component
public class ClientComponent {
private final PrototypeService prototypeService;
// При каждом внедрении будет создан новый экземпляр PrototypeService
public ClientComponent(PrototypeService prototypeService) {
this.prototypeService = prototypeService;
}
public void useService() {
prototypeService.setData("some data");
System.out.println(prototypeService.getData());
}
}Важно помнить: если singleton-бин внедряет prototype-бин, то prototype будет создан только один раз при инициализации singleton. Чтобы каждый раз получать новый экземпляр, можно использовать lookup-метод или провайдер (например, ObjectFactory или Provider).
Вывод: Prototype scope следует применять, когда вам нужны независимые экземпляры бина с собственным состоянием, которые не должны разделяться между разными клиентами или запросами. Это особенно полезно в многопоточных средах или веб-приложениях, где состояние объекта привязано к конкретному пользовательскому действию.