Spring Bean 作用域
分类
在我们写 xxx.xml 文件此 Spring 配置文件时,其中 <bean>
标签中有一个 scope
属性,这个属性指定了对象的作用范围。具体如下:
类型 | 说明 |
---|---|
singleton | 默认值,在 Spring 容器中仅存在一个 Bean 实例, Bean 以单实例的方式存在; |
prototype | 每次从容器中调用 Bean 时,都返回一个新的实例,即每次调用 get Bean () 时,相当于执行 new Xxx Bean () 操作。 |
request | 每次 HTTP 请求都会创建一个新的 Bean ,该 Bean 仅在当前HTTP request 内有效,此作用域仅适用于 WebApplicationContext 环境。 |
session | 每次 HTTP 请求都会创建一个新的 Bean ,该 Bean 仅在当前 HTTP Session 内有效。此作用域仅适用于 WebApplicationContext 环境。同一个 HTTP Session 共享一个 Bean ,不同的 HTTP Session 使用不同的 Bean 。 |
globalSession | 类似于上者,但是只应用在 Portlet 环境。如果没有 Portlet 环境那么 globalSession 相当于 session。此作用域仅适用于 WebApplicationContext 环境。 |
详解
singleton
单例作用域:当一个 Bean 的作用域为 singleton,那么Spring 容器中只会存在一个共享的 Bean 实例,并且所有对 Bean 的请求,只要 id 与该 Bean 定义相匹配,则只会返回 Bean 的同一实例。 singleton 是单例类型,即在创建起容器时就同时自动创建了一个 Bean 的对象,不管你是否使用。我们可以指定 Bean 节点的 lazy-init=”true”
来延迟初始化 Bean ,这时候,只有在第一次获取 Bean 时才会初始化 Bean ,即第一次请求该 Bean 时才初始化。 每次获取到的对象都是同一个对象。
配置方式:
- XML:
<bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" scope="singleton">
<bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" singleton="true"/>
- 使用注解
@Scope("singleton")
:@Service @Scope("singleton") public class ServiceImpl{…… }
prototype
原型作用域:当一个 Bean 的作用域为 prototype 时,表示一个 Bean 定义对应过个对象实例。每次程序对 Bean 进行请求时,都会创建一个新的 Bean 实例。它在我们创建容器的时候并没有实例化,而是当我们获取的时候才会去创建一个对象,并且每次获取到的对象不是同一个对象。
配置方式:
- XML:
<bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" scope="prototype"/>
<bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" singleton="false"/>
- 使用注解
@Scope("prototype")
:@Service @Scope("prototype") public class ServiceImpl{…… }
request
每次 HTTP 请求调用 car Bean 时,Spring 容器会自动创建一个新的 car Bean。
配置方式:
- XML:
<bean id="car" class="com.mindartisan.car" scope="request"/>
- 使用注解
@Scope("request")
或@RequestScope
session
car Bean 的作用域将横跨整个 HTTP Session,Session 中的所有 HTTP 请求都共享一个 car Bean。
- XML:
<bean id="car" class="com.mindartisan.car" scope="session"/>
- 使用注解
@Scope("session")
或@SessionScope
globalSession
类似于 session 作用域,不过仅在 Portlet(类似于 Servlet? 只知道是比较早的技术) 的 Web 应用中使用。Portlet 规范定义了全局 Session 的概念,它被组成 Portlet Web 应用的所有子 Portlet 共享。如果不在 Portlet Web 应用环境下,那么 globalSession 作用域等价于 session 作用域。
基于 XML 的配置方式:
<bean id="car" class="com.mindartisan.car" scope="globalSession"/>
singleton 与 prototype 区别
对于 singleton 作用域的 Bean 来说,每次请求该 Bean 都将获得相同的实例;对于 prototype 作用域的 Bean 来说,每次请求该 Bean 都会创建一个新的 Bean 实例。
生命周期:
类型 | 对象出生 | 对象活着 | 对象死亡 |
---|---|---|---|
singleton | 应用加载,容器被创建时对象创建 | 容器在,对象在 | 销毁容器时,对象销毁 |
prototype | 使用对象时创建新的对象 | 对象被使用就一直活着 | 长时间不用,被 GC 回收 |
选用:
- 无状态的 Bean、需要耗费大量资源的 Bean(数据库连接)、在整个应用中缓存和共享数据的 Bean、需要有序受控制的关闭程序时使用 singleton;
- 有状态的 Bean 使用 prototype。
有状态对象(Stateful Bean) : 就是有实例变量的对象,可以保存数据,是 非线程安全 的。每个用户有自己特有的一个实例,在用户的生存期内,bean 保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean 的生命期也告结束。即每个用户最初都会得到一个初始的 bean。
无状态对象(Stateless Bean): 就是没有实例变量的对象,不能保存数据,是不变类,是 线程安全 的。bean 一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态 bean。但无状态会话 bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。
参考
Bean Scopes 作用域
Spring容器中Bean的作用域
Prototype vs Singleton Spring Beans - How-to, Differences and Uses
《精通 Spring 4.x 企业应用开发实战》
Spring Bean 作用域相关推荐
- spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...
- Spring Bean作用域实例
在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例 - 每个Spring IoC 容器返回一个bean实例 原型- ...
- spring:Bean作用域
在配置文件中定义Bean时,用户不但可以配置Bean的属性值及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响. spring 4.0中所支持的作用域: ...
- Struts2 Action 与Spring bean 作用域
struts2 的action 是没有scope的,但通过引用spring bean 可以达到有scope功能. <action name="xxxAction" class ...
- spring bean作用域_Srping中Bean的三种装配方式:大魏Java记10
一.Bean的作用域 Spring在初始化一个Bean实例时,可以同时为其指定特定的作用域.作用域将会对Bean的生命周期和创建方式产生影响. Bean的作用域类型: Singleton作用域是Spr ...
- Spring Bean 作用域之间的区别?
Spring 容器中的bean 可以分为5 个范围.所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下: 1.singleton:这种bean 范围是默认的,这种范围确保不管接受到多少 ...
- Spring Bean作用域与生命周期
目录 Bean的作用域: Bean有六大行为模式 1.singleton:单例模式(默认) 2.prototype: 原型模式(多例模式) 3.request: 请求作用域(Spring MVC) 4 ...
- Spring IOC中 Bean 作用域
Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...
- Spring bean相关
Spring中指定Bean的作用于的方式 以下四种为例: 单例(默认,可以不用特殊表明) @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) ...
- Spring的作用域与生命周期
文章目录 一.lombok的安装与使用 二.Spring作用域 二.Bean原理分析 执行流程 Bean的生命周期 一.lombok的安装与使用 lombok插件可以提供给我们一些注释,这些注释可以很 ...
最新文章
- 在无Yum源的环境安装软件(CentOS)
- 2015年百度之星初赛(1) --- B 找连续数
- jQuery中 :first 和 :last 选择器诡异问题
- maven2——设置镜像篇
- scrapy框架的理解
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第15篇]RSA-OAEP和ECIES的密钥生成,加密和解密
- C++ STL list输出和增加
- Ansible AdHoc playbook API + 动态生成Inventory +结果关注
- (97)FPGA边沿检测(上升沿检测)
- Zabbix server is not running:the information displayed may not be current
- 员工培训管理系统设计与实现
- 全文检索技术Lucene
- 【数学建模】12 线性规划模型的求解方法
- 【MES】MES能为制造企业做什么,解决什么问题?
- 浅谈自适应滤波器---(快速RLS算法)
- Potplayer关闭播放时的信息
- 物权法全文内容有哪些呢-广告外链_有哪些网络推广免费平台?通过哪些平台进行免费推广及注意事项?...
- 计算机页面添加文字水印在哪,怎么添加水印-Word小技巧-快速添加高大上的水印...
- adb wifi连接android设备
- 探寻51个大数据应用案例背后的故事