概述
scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其 相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。
Spring容器bean的作用域类型:
- singleton:Spring IoC 容器的单个对象实例作用域都默认为singleton
- prototype:针对声明为拥有prototype scope的bean定义,容器在接到该类型对象的请求的时候,会每次都重新生成一个新的对象实例给请求方
- request:将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在 Web 感知 Spring ApplicationContext 的上下文中有效
- session:将单个 bean 定义限定为 HTTP 会话的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效
- application:将单个 bean 定义限定为 ServletContext 的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效
- websocket:将单个 bean 定义限定为 WebSocket 的生命周期。仅在 Web 感知 Spring ApplicationContext 的上下文中有效。
Singleton
配置中的bean定义可以看作是一个模板,容器会根据这个模板来构造对象。但是要根据这个模板
构造多少对象实例,又该让这些构造完的对象实例存活多久,则由容器根据bean定义的scope语意来决 定。标记为拥有singleton scope的对象定义,在Spring的IoC容器中只存在一个实例,所有对该对象的引 用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化之后,将一直存活到容器退出, 也就是说,它与IoC容器“几乎”拥有相同的“寿命”。
singleton的bean具有的特性:1、在容器中只存在一个共享的实例对象,所有对该类型的bean的依赖都引用这一单一的实例 2、从容器启动到它第一次请求被实例化开始,只要容器不被销毁或者退出,该类型bean的单一实例就会一直存活。
singleton类型bean工作原理
prototype
容器在接到该类型对象的请求的时候,会每次都重新 生成一个新的对象实例给请求方。所以,对于那些请求方不能共享使用的对象类型,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己对应的一个对象实例。
与其他作用域相比,Spring并不管理Prototype类型Bean的整个生命周期,因此在原型的情况下,配置的销毁生命周期回调不会被调用,客户端代码必须清理原型范围内的对象,并释放原型Bean所持有的昂贵资源。
request
Spring容器会为每个HTTP请求创建一个全新的Request-Processor对象供当前请求使用,当请求结束后,该对象实例的生命周期即告结束。当同时有10个HTTP 请求进来的时候,容器会分别针对这10个请求返回10个全新的RequestProcessor对象实例,且它们 之间互不干扰。从不是很严格的意义上说,request可以看作prototype的一种特例,除了场景更加具体 之外,语意上差不多。
session
Spring容器会为每个独立的session创建属于它们自己的全新的UserPreferences对象实例,除了拥有session scope的bean的实例具有比request scope的bean可能更长的存活时间,其他并无太大差异。
application
Spring容器通过为整个Web应用程序使用一次appPreferences Bean定义来创建AppPreferences Bean的新实例。这有点类似于 Spring 单例 bean,但在两个重要方面有所不同:它是每个 ServletContext 的单例,而不是每个 Spring ApplicationContext