本篇介绍Spring Bean实例的作用范围,Spring Bean实例的作用范围由配置项scope限定。通过本篇的学习,可以达成如下目标。

● 应用scope配置项配置Bean的作用域

● 应用单例模式singleton

● 应用原型模式prototype

1、作用域scope配置项

作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望每次IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。

scope配置项有5个属性,用于描述不同的作用域。

① singleton

使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

② prototype

使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。

③ request

该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

④ session

该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

⑤ global-session

该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

下面重点讨论singleton、prototyp作用域,request、session和global-session类作用域放到Spring MVC章节讨论,这里不再做详细讲述。

2、singleton作用域

singleton是默认的作用域,当定义Bean时,如果没有指定scope配置项,Bean的作用域被默认为singleton。singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是同一个实例。

配置Bean为singleton作用域的配置代码如下。

singleton作用域示例:

(1)课程案例新建SingletonTest类文件,添加下面的代码。

(2)修改IocPrincipal类文件,添加输出EmailNotice和PhoneNotice实例的hashCode,用于判断程序两次从IOC容器中获取的实例是否为同一实例。

(3)执行SingletonTest类文件,输出结果如下图所示。

图1 执行SingletonTest类输出结果

从输出结果可以看出,程序两次从IOC容器中获取的EmailNotice和PhoneNotice实例的hashCode是相同的,说明IOC容器返回的是同一个实例。

3、prototype作用域

当一个Bean的作用域被定义prototype时,意味着程序每次从IOC容器获取的Bean都是一个新的实例。因此,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

配置Bean为singleton作用域的配置代码如下。

prototype作用域示例:

(1)修改dispatcher.xml配置文件,在定义的Bean中添加prototype属性。

(3)执行SingletonTest类文件,输出结果如下图所示。

图2 添加prototype后执行SingletonTest

从输出结果可以看出,程序两次从IOC容器中获取的EmailNotice和PhoneNotice实例的hashCode是不相同的,说明EmailNotice和PhoneNotice添加prototype作用域后,IOC容器每次返回的都是一个新的实例。

课程小结

Spring IOC容器创建一个Bean实例时,可以为Bean指定实例的作用域,作用域包括singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)。

本文重点介绍了singleton和prototype模式,这两个模式的作用域在Spring框架中是经常用到的。对于singleton作用域的Bean,IOC容器每次都返回同一个实例,而prototype作用域的Bean,IOC容器每次产生一个新的实例。

理解Spring框架中Bean的作用域相关推荐

  1. 【面试题】Spring框架中Bean的生命周期

    生命周期 1.实例化一个Bean--也就是我们常说的new一个对象: 2.按照Spring上下文对实例化的Bean进行配置--也就是IOC注入: 3.如果这个Bean已经实现了BeanNameAwar ...

  2. 再见面试官:你能说说 Spring 框架中 Bean 的生命周期吗?

    首先简单说一下(以下为一个回答的参考模板) 1.实例化一个Bean--也就是我们常说的new: 2.按照Spring上下文对实例化的Bean进行配置--也就是IOC注入: 3.如果这个Bean已经实现 ...

  3. Spring容器中Bean的作用域

    当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...

  4. java中bean的定义有哪些_详解Java的Spring框架中bean的定义以及生命周期

    bean的定义形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的定义, ...

  5. Spring框架中bean的生命周期

    ean在Spring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对Spring如何管理bean进行个性化定制. 正如你所见,在bean准备就绪之前,bean工厂执行了若干启动步骤. 我们对上图进 ...

  6. spring框架中Bean的基本属性及调用外部properties等配置文件的方法介绍

    Bean的基本属性 id属性: Bean的唯一标识名.它必须是合法的XML ID,在配置文件中,不能有重复id的Bean,因为容器在获取Bean的实例时都用它来做唯一索引. name属性: 用来为id ...

  7. 阐述Spring框架中Bean的生命周期?

    ① Spring IoC容器找到关于Bean的定义并实例化该Bean. ② Spring IoC容器对Bean进行依赖注入. ③ 如果Bean实现了BeanNameAware接口,则将该Bean的id ...

  8. Spring框架中的Bean

    1.什么是Bean? 在Spring框架中,Bean是指一个由Spring容器管理的对象.这个对象可以是任何一个Java类的实例,例如数据库连接.业务逻辑类.控制器等等.Bean实例的创建和管理是由S ...

  9. Spring框架中的设计模式(一)

    设计模式有助于遵循良好的编程实践.作为最流行的Web框架之一的Spring框架也使用其中的一些. 本文将介绍Spring Framework中使用的设计模式.这是5篇专题文章的第一部分.这次我们将发现 ...

最新文章

  1. cacti cmd.php 解析,CACTI搭建 - Linux论坛 - 51CTO技术论坛_中国领先的IT技术社区
  2. Ansible Playbook详解
  3. 万里挑一!北大AI女神每天必看的几个优质公众号
  4. 面向兑现编程(四):多态
  5. 2016年3月19日 培训复习
  6. 原理探究——空间平滑MUSIC算法
  7. FeedDemon 2.6.0.20 Final
  8. 十二首《临江仙》,说尽心中无限事
  9. Vue中使用mavonEditor插件实现markdown在线编辑
  10. 《人工智能实践:Tensorflow笔记》听课笔记22_6.1输入手写数字图片输出识别结果
  11. 2021年汽车驾驶员(技师)模拟考试软件及汽车驾驶员(技师)理论考试
  12. matlab程序算天气,科学网—站点气温数据的积温计算(含Matlab程序实现) - 朱永超的博文...
  13. css单位vw vh,css3自适应布局单位vw,vh详解
  14. Java九十条经验法则之第一条:用静态工厂方法代替构造器
  15. git下载子模块命令git clone --recursive和git submodule update --init
  16. 【机器人轨迹规划】ur16e机器人三维模型+轨迹规划+画五角星轨迹
  17. python调用cplex求解装箱问题_装箱问题的CPLEX求解
  18. 随身wifi硬盘扩容详细教程
  19. 周志华《Machine Learning》学习笔记(12)--降维与度量学习
  20. manacher getmin

热门文章

  1. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码...
  2. hdu 3641 数论 二分求符合条件的最小值数学杂题
  3. sessionStorage localStorage cookie
  4. 开发辅助工具Kalman Studio2.0发布,内置基于T4的代码生成器
  5. 无窗口激活ActiveX控件的bug
  6. 记录一个SpringBoot集成邮件及工具类博客
  7. python里else中文意思_Python循环语句中else的用法总结
  8. python工作岗位要求_Python就业:Python就业岗位职能要求解析
  9. JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...
  10. php 事件调度,MySQL的事件调度器使用介绍