Spring Series Four: Bean Scopes

Spring
Spring Series Four: Bean Scopes

Легко узнать сторону восточного ветра, и это всегда весна, когда она красочна.

Обзор

существуетSpringframework, мы можем использовать шесть встроенныхspring beanсоздан в рамкахbean, вы также можете определитьbeanОбъем. Из этих шести диапазонов только при использовании поддержкиWebизapplicationContext, четыре из них доступны.singletonа такжеprototypeПрицелы могут использоваться для любого типаiocконтейнер.

Типы областей действия Spring Bean

существуетSpring, ты можешь использоватьspringсередина@ScopeОпределение аннотацииbeanобъем . Ниже мы перечислили эти шесть вSpringВстроенный используется в контексте приложенияbeanобъем. Эти же области применимы и кspring boot beanобъем.

SCOPE описывать
singleton spring IoCКонтейнер существуетbeanэкземпляр объекта.
prototype В отличие от синглтона, каждый запросbean, он создает новый экземпляр.
request существуетHTTPпросить(Request), создается и используется один экземпляр. относятся только кwebОкружающая обстановкаSpring ApplicationContextэффективен в.
session существуетHTTPсеанс (Session), создается и используется один экземпляр. относятся только кwebОкружающая обстановкаSpring ApplicationContextэффективен в.
application будетServletContextОдин экземпляр создается и используется в течение всего жизненного цикла. относятся только кwebОкружающая обстановкаSpring ApplicationContextэффективен в.
websocket В течение всего жизненного цикла WebSocket будет создан и использован один экземпляр. относятся только кwebОкружающая обстановкаSpring ApplicationContextэффективен в.

одноэлементная область

singletonдаspringОбласть по умолчанию для bean-компонентов в контейнере. Он говорит контейнеру создавать и управлять только однимbeanэкземпляр класса. Единственный экземпляр хранится в таком синглтонеbeanв кэше, а названныйbeanВсе последующие запросы и ссылки возвращают экземпляр этого кеша.

использоватьJavaНастроенная одноэлементная областьbeanПример:

@Component
@Scope("singleton")  //可以省略,默认即是singleton
public class BeanClass {

}

использоватьXMLНастроенная одноэлементная областьbeanПример:

<!-- 后面的singleton可以省略 -->
<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="singleton" />
//or
<bean id="beanId" class="cn.howtodoinjava.BeanClass" />

объем прототипа

Каждая пара приложенийBeanКогда запрос сделан, область прототипа создает новыйBeanпример.

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

прототипbeanспектрJavaПример конфигурации:

@Component
@Scope("prototype")
public class BeanClass {
}

прототипbeanспектрXMLПример конфигурации:

<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="prototype" />

В общем, у вас должно быть состояние для всехbeanИспользуйте область прототипа, которая не имеет состоянияbeanИспользуйте одноэлементную область.

для использования в запросах, сессиях, приложениях иwebsocketиспользовать в рамкахbean, вам необходимо зарегистрироватьсяRequestContextListenerилиRequestContextFilter.

область запроса

В области запроса контейнер для каждогоHTTPЗапрос на создание нового экземпляра. Таким образом, если сервер в настоящее время обрабатывает 50 запросов, в контейнере может быть до 50 запросов.beanОтдельный экземпляр класса. Любые изменения состояния одного экземпляра невидимы для других экземпляров. Эти экземпляры уничтожаются после завершения запроса.

requestпроситьbeanспектрJavaПример конфигурации:

@Component
@Scope("request")
public class BeanClass {
}

//or

@Component
@RequestScope
public class BeanClass {
}

requestпроситьbeanспектрXMLПример конфигурации:

<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="request" />

область сеанса

В области сеанса контейнер предназначен для каждогоHTTPСессия создает новый экземпляр. Таким образом, если на сервере 20 активных сеансов, в контейнере может быть до 20 сеансов.beanОтдельный экземпляр класса. Все в течение жизни одного сеансаHTTPзапросы могут обращаться к одному и тому жеbeanпример.

В области сеанса любые изменения состояния одного экземпляра невидимы для других экземпляров. Эти экземпляры уничтожаются после уничтожения/завершения сеанса на сервере.

sessionпроситьbeanспектрJavaПример конфигурации:

@Component
@Scope("session")
public class BeanClass {
}

//or

@Component
@SessionScope
public class BeanClass {
}

sessionпроситьbeanспектрXMLПример конфигурации:

<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="session" />

область применения

В масштабе приложения контейнер предназначен для каждогоwebЭкземпляр создается при запуске приложения. Он почти аналогичен одноэлементному прицелу с двумя отличиями. который:

  1. область примененияbeanкаждыйServletContextОдноэлементный объект, в то время как одноэлементная областьbeanкаждыйApplicationContextодноэлементный объект. Обратите внимание, что одно приложение может иметь несколько контекстов приложений.
  2. область примененияbeanв видеServletContextсвойства видны.

application beanспектрJavaПример конфигурации:

@Component
@Scope("application")
public class BeanClass {
}

//or

@Component
@ApplicationScope
public class BeanClass {
}

application beanспектрXMLПример конфигурации:

<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="application" />

область действия веб-сокета

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

в этом типеWebзаявление,HTTPИспользуется только для первоначального рукопожатия. Если сервер согласен, сервер можетHTTPОтвет со статусом 101 (протокол обмена). Если рукопожатие прошло успешно, тоTCPСокет остается открытым, и клиент и сервер могут использовать сокет для отправки сообщений друг другу.

websocket beanспектрJavaПример конфигурации:

@Component
@Scope("websocket")
public class BeanClass {
}

websocket beanспектрXMLПример конфигурации:

<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="websocket" />

Пожалуйста, обрати внимание,websocketв диапазонеbeanобычно является синглтоном и более эффективен, чем любой синглтонWebSocketСрок действия сеанса дольше.

настраиваемый объем потока

Springтакже используйте классSimpleThreadScopeПредоставляется нестандартная область потока. Чтобы использовать эту область, вы должны использоватьCustomScopeConfigurerКласс регистрирует его в контейнере.

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="thread">
                <bean class="org.springframework.context.support.SimpleThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

правильноbeanКаждый запрос возвращает один и тот же экземпляр в одном и том же потоке.

нитьbeanспектрJavaПример конфигурации:

@Component
@Scope("thread")
public class BeanClass {
}

нитьbeanспектрxmlПример конфигурации:

<bean id="beanId" class="cn.howtodoinjava.BeanClass" scope="thread" />

Суммировать

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

Пожалуйста, запомните всю информацию, приведенную выше, чтобы ответить на любойspring beanВопросы для интервью по объему.

Оригинальная ссылка:Весна 5 — прицелы Bean