Что такое bean scope и какие типы скоупов поддерживаются в Spring


Bean scope в Spring определяет время жизни и доступность бинов в приложении. Когда мы определяем бин в контексте Spring, мы можем указать его scope, чтобы указать, какой объект будет создан и как долго он будет существовать.

Spring поддерживает пять типов скоупов:

  • Singleton — по умолчанию для всех бинов. Означает, что Spring создает только один экземпляр бина на все приложение и делится им между всеми объектами, которые его требуют.
  • Prototype — для каждого запроса на получение бина, Spring создает новый экземпляр.
  • Request — бин создается и используется в рамках одного HTTP-запроса. Создается новый экземпляр для каждого запроса.
  • Session — бин создается и используется в рамках одной HTTP-сессии пользователя. Создается новый экземпляр для каждой сессии.
  • Global Session — похож на Session scope, но используется только в контексте портлетов в веб-приложениях.

Выбор подходящего scope для бина важен для эффективной работы приложения. Например, если мы хотим создать бин, который используется несколько раз, но не хотим создавать новый экземпляр каждый раз, то мы должны использовать Singleton scope.

Настройка скоупа бина в Spring позволяет нам эффективно управлять ресурсами и создавать бины, которые соответствуют требуемой функциональности приложения.

Bean scope в Spring и его типы

Тип скоупаОписание
SingletonПо умолчанию используется скоуп Singleton. Бин с таким скоупом создается только один раз при старте приложения и используется во всем контексте.
PrototypeБин с скоупом Prototype создается каждый раз при запросе из контекста Spring. Таким образом, каждый запрос возвращает новый объект.
RequestБин с скоупом Request создается один раз для каждого HTTP-запроса. То есть, каждый запрос получает свой собственный объект бина.
SessionБин с скоупом Session создается один раз для каждой HTTP-сессии. То есть, каждая сессия получает свой собственный объект бина.
Global SessionБин с скоупом Global Session создается один раз для всей глобальной сессии приложения. То есть, все сессии будут использовать один и тот же объект бина.

При определении скоупа бина необходимо учитывать особенности каждого типа и требования приложения. Выбор правильного скоупа помогает оптимизировать использование памяти и управление ресурсами.

Singleton — самый распространенный тип скоупа в Spring

По умолчанию все бины в Spring являются singleton’ами. Они создаются при инициализации контейнера и остаются в памяти до его уничтожения. Все ссылки на данный бин указывают на один и тот же объект, что обеспечивает глобальную видимость и совместное использование ресурсов.

Однако следует быть осторожным при использовании singleton’ов, так как они не потокобезопасны. Если singleton используется в многопоточной среде и имеет изменяемое состояние, то могут возникнуть проблемы с синхронизацией данных. В таких случаях обычно применяются механизмы синхронизации, такие как блокировки и мьютексы.

Важно отметить, что singleton не подходит для бинов с сильной зависимостью от контекста, например, для компонентов, которые хранят состояние пользовательской сессии или открытых соединений с базой данных. В таких случаях лучше использовать другие типы скоупов, такие как prototype или session.

В Spring также поддерживается дополнительный подтип singleton’а — «Eager Singleton». Он отличается от обычного singleton’а тем, что создается при загрузке контекста и инстанцируется сразу после него. Это может быть полезно в случаях, когда необходимо осуществить какую-то предварительную настройку или подготовку бинов до их первого использования.

Prototype — создание нового объекта бина при каждом запросе

Прототипный скоуп в Spring предполагает создание нового объекта бина каждый раз, когда он запрашивается из контейнера. Это означает, что при каждом обращении к бину будет создан новый экземпляр, который будет полностью изолирован от предыдущих запросов.

Такой скоуп полезен в случаях, когда требуется использовать различные экземпляры бина в разных частях приложения или когда состояние бина может изменяться в процессе его использования.

Прототипный скоуп может быть особенно полезен, когда бинам требуется много «ресурсов», например, подключение к базе данных, а каждому запросу нужно работать с собственным экземпляром ресурса.

Для определения прототипного скоупа используется аннотация @Scope с указанием значения «prototype».

Пример:

@Component@Scope("prototype")public class MyBean {// Код бина}

При каждом обращении к бину MyBean будет создан новый экземпляр, что может быть полезно в случаях, когда требуется изолированное использование бина.

Request — бин создается для каждого запроса

Когда бин объявлен с Request скоупом, каждый раз при поступлении HTTP-запроса будет создаваться новый экземпляр этого бина. Другими словами, Request скоуп означает создание и уничтожение бина для каждого запроса.

Это может быть полезно, например, для бинов, которые выполняют операции, уникальные для каждого запроса, такие как формы, сессии и другие динамические данные, связанные с запросом.

При использовании Request скоупа необходимо учитывать, что каждый новый экземпляр бина занимает память, поэтому следует быть осторожным с созданием слишком многочисленных бинов с данным скоупом.

Для указания Request скоупа в Spring XML конфигурации необходимо использовать атрибут scope="request" при определении бина.

Session — бин существует в рамках сессии пользователя

Скоуп «Session» предоставляет возможность создания бина, который существует в рамках сессии пользователя. Это означает, что каждый пользователь, открывший веб-приложение, будет иметь свою собственную копию данного бина, доступную только для него.

Когда пользователь выполняет вход в приложение, ему назначается уникальная сессия, которая сохраняет состояние пользователя на протяжении его взаимодействия с приложением. Бины скоупа «Session» живут в течение всей длительности этой сессии и уничтожаются, когда пользователь завершает или истекает его сессия.

Скоуп «Session» часто используется для хранения информации, специфичной для каждого пользователя, например, его предпочтений, настроек или состояния. Это может быть сервис, предоставляющий информацию о пользователе или его корзину покупок.

Global session — бин на уровне глобальной сессии

Cкоуп глобальной сессии поддерживается только в веб-приложениях на основе сервлетов и представляет собой бин, который существует на уровне глобальной пользовательской сессии приложения. Глобальная сессия представляет собой специальное хранилище данных, которое сохраняется между запросами к веб-приложению и доступно для всех пользователей, работающих с этим приложением.

Когда бин помечается аннотацией @Scope(«globalSession»), Spring создает только один экземпляр этого бина на уровне глобальной сессии, и все пользователи, работающие с приложением, могут использовать этот экземпляр.

Глобально выделяемый скоуп используется в случаях, когда требуется сохранять состояние бина между разными запросами или когда необходимо обеспечить доступ к одному экземпляру бина для всех пользователей приложения.

Однако следует быть осторожным при использовании глобального скоупа, так как он может привести к проблемам с производительностью и масштабируемостью, особенно в случае большого количества пользователей или данных. Кроме того, не все контейнеры поддерживают скоуп глобальной сессии, поэтому необходимо убедиться, что контейнер, в котором развертывается приложение, поддерживает этот тип скоупа.

Application — бин живет на протяжении всего жизненного цикла приложения

Это означает, что при каждом запросе бин будет использоваться и будет одинаковым для всех пользователей, которые обращаются к приложению. Если изменения в бине вносятся одним пользователем, они будут видны и другим пользователям.

Application scope подходит для бинов, которые не зависят от данных пользователя и могут быть общими для всех. Например, бин, отвечающий за настройку приложения или бин, содержащий информацию о состоянии приложения.

Для определения бина с application scope в Spring используется аннотация @Scope с параметром «application». Например:

@Component@Scope("application")public class AppConfig {//...}

При использовании application scope важно учитывать, что бин будет создан только один раз при старте приложения и будет существовать до его выключения.

WebSocket — бин для работы с WebSocket соединениями

WebSocketHandler — это Spring-бин, предназначенный для обработки входящих и исходящих сообщений в WebSocket соединении. Он определяет методы для обработки различных событий, таких как установка соединения, прием сообщений от клиента и отправка сообщений обратно клиенту.

Для создания WebSocketHandler бина в Spring, необходимо аннотировать класс, реализующий интерфейс WebSocketHandler, аннотацией @Component для определения его как Spring-компонента. Также можно использовать аннотацию @Scope, чтобы указать конкретный скоуп для бина, например, @Scope(«singleton») или @Scope(«prototype»).

После создания WebSocketHandler бина, его можно инжектировать в другие компоненты Spring, такие как контроллеры или сервисы, чтобы использовать его для работы с WebSocket соединениями. Внутри этих компонент можно вызывать методы WebSocketHandler’а для установки соединения, отправки сообщений клиенту или обработки входящих сообщений.

Таким образом, работа с WebSocket соединениями в Spring является достаточно простой и удобной. Создание и использование бина WebSocketHandler позволяет эффективно обрабатывать WebSocket соединения в приложении и осуществлять надежное взаимодействие с клиентами.

Добавить комментарий

Вам также может понравиться