spring5核心原理 - Bean 作用域

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(599)   2024-04-17 12:31:29
在 Spring 框架中,我们可以在 6 个内置的spring bean 作用域内创建 bean ,您也可以定义自定义 bean 作用域。在这六个作用域中,只有在您使用 Web 感知的ApplicationContextsingletonprototype作用域可用于任何类型的 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,您需要注册RequestContextListeneror RequestContextFilter


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作用域相似,只有两个不同之处,即
  1. applicationscoped bean 是 singleton per ServletContext,而singletonscoped bean 是 singleton per ApplicationContext。请注意,单个应用程序可以有多个应用程序上下文。
  2. applicationscoped 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.自定义线程作用域

threadSpring 还使用 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 相互引用时,我们必须做出明智的决定。


 
地址:https://www.leftso.com/article/984.html

相关阅读

在 Spring 框架中,我们可以在 6 个内置的spring bean 作用域内创建 bean ,您也可以定义自定义 bean 作用域。在这六个作用域中,只有在您使用 Web 感知的Appli...
Spring框架中,可以在6个内置的Scope中创建bean,也可以定义自定义范围。 在这六个范围中,只有在使用Web感知的ApplicationContext时才有四个范围可用。singlet...
Spring框架Spring IoC容器的核心原理,前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的...
了解Spring bean 生命周期。我们将了解 bean生命周期阶段、初始化和销毁​​回调方法。我们将学习使用 XML 配置以及 Java 注释配置来自定义 bean 生命周期事件。1. 什么...
在 Spring 框架中,在配置文件中声明 bean 依赖项是一个很好的做法,因此 Spring 容器能够自动装配协作 bean 之间的关系。这意味着可以通过检查BeanFactory的内容让 ...
在 Spring 框架中,按类型自动装配 bean 允许自动装配属性 -如果容器中只有一个属性类型的 bean。如果有多个,则会抛出一个致命异常,这表明您可能不会byType对该 bean 使用...
FactoryBean 是用作在IoC 容器中创建其他 bean 的工厂bean 。从概念上讲,FactoryBean 与factory method非常相似,但它是 Spring 特定的 be...
在 Spring 框架中,通过构造函数自动装配 bean类似于byType,但适用于构造函数参数。在启用自动装配的 bean 中,它查找构造函数参数的类类型,然后按类型对所有构造函数参数执行自动...
在 Spring 框架中,按名称自动装配 bean 允许对属性进行自动装配,这样它将检查容器并查找名称与需要自动装配的属性完全相同的 bean。例如,如果您有一个按名称设置为自动装配的 bean...
spring boot如何跨域?本文将讲解在spring boot项目中的跨域问题如何解决。