Ответ
Spring определяет несколько стандартных областей видимости (scopes) для бинов, которые управляют их жизненным циклом и количеством создаваемых экземпляров.
Основные scopes:
| Scope | Описание | Контекст |
|---|---|---|
singleton (по умолчанию) |
Создается один экземпляр на IoC-контейнер. Все запросы возвращают один и тот же объект. | Любой |
prototype |
Создается новый экземпляр при каждом запросе бина из контейнера. | Любой |
request |
Один экземпляр на жизненный цикл одного HTTP-запроса. | Web (Spring MVC) |
session |
Один экземпляр на HTTP-сессию пользователя. | Web (Spring MVC) |
application |
Один экземпляр на жизненный цикл ServletContext. Аналогичен singleton, но привязан к web-контексту. |
Web (Spring MVC) |
websocket |
Один экземпляр на жизненный цикл WebSocket-сессии. | Web (WebSocket) |
Способы указания scope:
-
Аннотация
@Scope:@Component @Scope("prototype") // или @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class MyPrototypeBean {} -
Специализированные аннотации (для web-контекста):
@Component @RequestScope // Эквивалентно @Scope("request") public class MyRequestScopedBean {}Также доступны
@SessionScopeи@ApplicationScope. -
В XML-конфигурации:
<bean id="myBean" class="com.example.MyBean" scope="prototype"/>
Почему это важно:
singletonиспользуется для stateless-сервисов, репозиториев, утилитных классов (эффективно по памяти).prototypeнужен для stateful-бинов, состояние которых уникально для каждого использования (например, объект корзины покупок в момент создания).- Web-скопы (
request,session) обеспечивают изоляцию данных между разными пользователями и запросами.