分类

在我们写 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 时才初始化。 每次获取到的对象都是同一个对象。

配置方式:

  1. XML:

    <bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" scope="singleton">
    
    <bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" singleton="true"/>
    
  2. 使用注解 @Scope("singleton")
    @Service
    @Scope("singleton")
    public class ServiceImpl{……
    }
    

prototype

原型作用域:当一个 Bean 的作用域为 prototype 时,表示一个 Bean 定义对应过个对象实例。每次程序对 Bean 进行请求时,都会创建一个新的 Bean 实例。它在我们创建容器的时候并没有实例化,而是当我们获取的时候才会去创建一个对象,并且每次获取到的对象不是同一个对象。

配置方式:

  1. XML:

    <bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" scope="prototype"/>
    
    <bean id="ServiceImpl" class="com.mindartisan.service.ServiceImpl" singleton="false"/>
    
  2. 使用注解 @Scope("prototype")
    @Service
    @Scope("prototype")
    public class ServiceImpl{……
    }
    

request

每次 HTTP 请求调用 car Bean 时,Spring 容器会自动创建一个新的 car Bean。

配置方式:

  1. XML:

    <bean id="car" class="com.mindartisan.car" scope="request"/>
    
  2. 使用注解 @Scope("request")@RequestScope

session

car Bean 的作用域将横跨整个 HTTP Session,Session 中的所有 HTTP 请求都共享一个 car Bean。

  1. XML:

    <bean id="car" class="com.mindartisan.car" scope="session"/>
    
  2. 使用注解 @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 回收

选用:

  1. 无状态的 Bean、需要耗费大量资源的 Bean(数据库连接)、在整个应用中缓存和共享数据的 Bean、需要有序受控制的关闭程序时使用 singleton;
  2. 有状态的 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 作用域相关推荐

  1. spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...

  2. Spring Bean作用域实例

    在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例 - 每个Spring IoC 容器返回一个bean实例 原型- ...

  3. spring:Bean作用域

    在配置文件中定义Bean时,用户不但可以配置Bean的属性值及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响. spring 4.0中所支持的作用域: ...

  4. Struts2 Action 与Spring bean 作用域

    struts2 的action 是没有scope的,但通过引用spring bean 可以达到有scope功能. <action name="xxxAction" class ...

  5. spring bean作用域_Srping中Bean的三种装配方式:大魏Java记10

    一.Bean的作用域 Spring在初始化一个Bean实例时,可以同时为其指定特定的作用域.作用域将会对Bean的生命周期和创建方式产生影响. Bean的作用域类型: Singleton作用域是Spr ...

  6. Spring Bean 作用域之间的区别?

    Spring 容器中的bean 可以分为5 个范围.所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下: 1.singleton:这种bean 范围是默认的,这种范围确保不管接受到多少 ...

  7. Spring Bean作用域与生命周期

    目录 Bean的作用域: Bean有六大行为模式 1.singleton:单例模式(默认) 2.prototype: 原型模式(多例模式) 3.request: 请求作用域(Spring MVC) 4 ...

  8. ​Spring IOC中 Bean 作用域

    ​Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...

  9. Spring bean相关

    Spring中指定Bean的作用于的方式 以下四种为例: 单例(默认,可以不用特殊表明) @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) ...

  10. Spring的作用域与生命周期

    文章目录 一.lombok的安装与使用 二.Spring作用域 二.Bean原理分析 执行流程 Bean的生命周期 一.lombok的安装与使用 lombok插件可以提供给我们一些注释,这些注释可以很 ...

最新文章

  1. 在无Yum源的环境安装软件(CentOS)
  2. 2015年百度之星初赛(1) --- B 找连续数
  3. jQuery中 :first 和 :last 选择器诡异问题
  4. maven2——设置镜像篇
  5. scrapy框架的理解
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第15篇]RSA-OAEP和ECIES的密钥生成,加密和解密
  7. C++ STL list输出和增加
  8. Ansible AdHoc playbook API + 动态生成Inventory +结果关注
  9. (97)FPGA边沿检测(上升沿检测)
  10. Zabbix server is not running:the information displayed may not be current
  11. 员工培训管理系统设计与实现
  12. 全文检索技术Lucene
  13. 【数学建模】12 线性规划模型的求解方法
  14. 【MES】MES能为制造企业做什么,解决什么问题?
  15. 浅谈自适应滤波器---(快速RLS算法)
  16. Potplayer关闭播放时的信息
  17. 物权法全文内容有哪些呢-广告外链_有哪些网络推广免费平台?通过哪些平台进行免费推广及注意事项?...
  18. 计算机页面添加文字水印在哪,怎么添加水印-Word小技巧-快速添加高大上的水印...
  19. adb wifi连接android设备
  20. 探寻51个大数据应用案例背后的故事

热门文章

  1. 基于微信小程序的网上购物系统的设计与实现.pdf
  2. python常用命令
  3. 科学道德与学风-2021雨课堂答案-第5章
  4. 合与荣—— 惠普融合战略的深化与落地
  5. 央行数字货币在技术上是如何实现的
  6. php酒店客房管理,基于PHP的酒店客房管理系统的设计与实现2.doc
  7. 代码注释的艺术,优秀代码真的不需要注释吗?
  8. ShardingSphere-ElasticJob踩的坑 截至3.0.1版本
  9. ElasticJob‐Lite:事件追踪
  10. 米思齐Mixly图形化编程---RFID智能门禁