Вопрос проверяет знание областей видимости (scope) бинов в Spring, что необходимо для управления жизненным циклом объектов и их зависимостями в контейнере IoC.
В Spring Framework область видимости (scope) бина определяет жизненный цикл и видимость экземпляра этого бина внутри контейнера Spring IoC. Понимание различных scope критически важно для корректного управления состоянием объектов, особенно в многопоточных и веб-средах.
Spring предоставляет шесть встроенных областей видимости, из которых первые две являются основными и доступны в любом контексте приложения:
getBean() или когда он внедряется в другой бин. Используется для stateful-бинов, состояние которых должно быть уникальным для каждого использования, например, для объектов, представляющих данные формы.Следующие четыре области видимости доступны только в веб-ориентированном контексте приложения (например, WebApplicationContext):
ServletContext. Это похоже на синглтон, но с важным отличием: синглтон привязан к контексту Spring, а application scope — к ServletContext. Используется для хранения данных, общих для всего веб-приложения.Область видимости можно задать с помощью аннотации @Scope или в XML-конфигурации.
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.RequestScope;
@Component
@Scope("prototype") // Будет создаваться новый экземпляр при каждом внедрении
public class PrototypeService {
// ...
}
@Component
@RequestScope // Бин будет жить в рамках одного HTTP-запроса
public class RequestScopedBean {
private String requestData;
// ...
}Выбор правильной области видимости напрямую влияет на корректность работы приложения, потребление памяти и потокобезопасность. Синглтон следует использовать для stateless-компонентов, в то время как request или session scope необходимы для хранения пользовательских данных. Prototype полезен, когда состояние объекта не должно разделяться между разными клиентами операции.
Итог: Знание и правильное применение scope бинов в Spring позволяет эффективно управлять жизненным циклом объектов, избегая утечек памяти и конфликтов данных, особенно в многопользовательских веб-приложениях.