在 Spring 框架中,我们可以在 6 个内置的spring bean 作用域内创建 bean ,您也可以定义自定义 bean 作用域。在这六个作用域中,只有在您使用 Web 感知的ApplicationContext
. singleton
和prototype
作用域可用于任何类型的 IOC 容器。
1. Spring Bean Scopes 类型
在 Spring 中,可以使用 spring bean @Scope注解来定义作用域。让我们快速列出所有六个可在 Spring 应用程序上下文中使用的内置 bean 作用域。这些相同的作用域也适用于Spring Boot Bean 作用域。
作用域 | 描述 |
---|---|
singleton (默认) |
每个 Spring IoC 容器的单个 bean 对象实例 |
prototype |
与单例相反,它每次request bean 时都会生成一个新实例。 |
request |
在 HTTP 请求的整个生命周期中,将创建单个实例并使其可用。仅在 web 感知 Spring 中有效ApplicationContext 。 |
session |
在 HTTP 会话的整个生命周期中,将创建单个实例并使其可用。仅在 web 感知 Spring 中有效ApplicationContext 。 |
application |
单个实例将在ServletContext .仅在 web 感知 Spring 中有效ApplicationContext 。 |
websocket |
单个实例将在WebSocket .仅在 web 感知 Spring 中有效ApplicationContext 。 |
1.1。单例作用域
singleton
是 spring 容器中的默认 bean 作用域。它告诉容器每个容器只创建和管理一个 bean 类的实例。此单个实例存储在此类单例bean 的缓存中,并且该命名 bean 的所有后续请求和引用都返回缓存的实例。
使用 Java 配置的单例作用域 bean 的示例
@Component
//This statement is redundant - singleton is default scope
@Scope("singleton") //This statement is redundant
public class BeanClass {
}
使用 XML 配置的单例作用域 bean 示例
<!-- To specify singleton scope is redundant -->
<bean id="beanId" class="com.leftso.BeanClass" scope="singleton" />
//or
<bean id="beanId" class="com.leftso.BeanClass" />
1.2. prototype 作用域
prototype
每次应用程序代码发出对 bean 的请求时,作用域都会导致创建一个新的 bean 实例。
要知道销毁bean生命周期方法不叫prototype
作用域bean,只调用初始化回调方法。因此,作为开发人员,您负责清理prototype作用域内的 bean 实例以及那里拥有的任何资源。
prototype 配置 bean 作用域的 Java 配置示例 –
@Component
@Scope("prototype")
public class BeanClass {
}
prototype bean 作用域的 XML 配置示例 –
<bean id="beanId" class="com.leftso.BeanClass" scope="prototype" />
通常,您应该更喜欢使用
prototype
所有有状态 bean 的singleton
作用域和无状态 bean 的作用域。要在请求、会话、应用程序和 websocket 作用域内使用 bean,您需要注册
RequestContextListener
orRequestContextFilter
。
1.3. request 作用域
在request
作用域内,容器为每个 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="com.leftso.BeanClass" scope="request" />
1.4. session作用域
在session
作用域内,容器为每个 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="com.leftso.BeanClass" scope="session" />
1.5。application作用域
在application
作用域内,容器为每个 Web 应用程序运行时创建一个实例。它几乎与singleton
作用域相似,只有两个不同之处,即
application
scoped bean 是 singleton perServletContext
,而singleton
scoped bean 是 singleton perApplicationContext
。请注意,单个应用程序可以有多个应用程序上下文。application
scoped 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.leftso.BeanClass" scope="application" />
1.6. websocket作用域
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.leftso.BeanClass" scope="websocket" />
请注意,websocket
作用域 bean 通常是单例的,并且比任何单独的 WebSocket 会话寿命更长。
2.自定义线程作用域
thread
Spring 还使用 class提供了一个非默认作用域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="com.leftso.BeanClass" scope="thread" />
三、总结
Spring 框架提供了六个 Spring bean 作用域,每个作用域内的实例具有不同的生命周期。作为开发人员,我们必须明智地选择任何容器管理 bean 的作用域。此外,当不同作用域的 bean 相互引用时,我们必须做出明智的决定。
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/243946.html