Spring中bean的单例与多例

  • 前言
  • Spring中单例与多例
    • 如何配置单例/多例
    • 单例/多例Bean的使用事项
  • 总结

前言

之前其实已经学习过对于单例模式的使用单例模式讲解,也用过一段时间的SpringMVC与SpringBoot,但其实一直没有去关注Spring中bean的单例/多例的使用,这里由于最近想要在Springboot项目中创建一个单例的工厂类,才发现Spring中bean其实默认就是单例的。

Spring中单例与多例

如何配置单例/多例

默认的bean即是单例的,

两种模式 区别
饿汉模式 spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例
懒汉模式 在第一个请求时才生成一个实例,以后的请求都调用这个实例
spring singleton设置为懒汉模式: beans default-lazy-init=“true”/>

这里主要介绍多例的两种创建方式:
1 在类上加一个注解
@Scope(“prototype”)
2 在xml配置
bean id=" " class=“xxx.xxx.xxx” scope=“prototype”>
scope的配置级别
prototype:针对web项目,每次请求都生成新的的bean实例
request:针对web项目,不同的请求创建单独的bean对象,同一个请求共享一个bean
session:针对web项目,不同的会话创建单独的bean对象,同一个会话共享一个bean

单例/多例Bean的使用事项

单例的使用其实没什么好说的,对于一些可以共享的组件,自然是优先使用单例Bean,可以节省内存开销并减少维护Bean的生成与销毁所带来的额外开销。

无论单例多例,如果无需共享一些状态(对变量的修改)则应尽可能的使bean无状态化,即不适用static来创建共享的属性或方法。
主要问题在于多线程并发访问下使用多例Bean可能带来的线程安全问题。

线程安全出现问题的主要原因无非在于多实例或多线程下对于bean中共享变量的访问,
对于共享变量的处理,主要有两种方式:

  1. 对于无需共享的变量,不要使用static来进行修饰,否则导致多例共享同一变量(也可以说,对于无需共享状态的bean,应该构建无状态bean,该bean无论怎么被使用,自身应该是不保留状态,也不变化的)
  2. 对于需要共享的变量,无论是在单例中被各个请求修改,还是在多例中被并发修改,都需要考虑并发控制问题(同样的,有状态bean是否需要共享状态以及如何共享,是个问题)

这里主要考虑两种并发控制方式:
3. 使用锁来保证线程安全,用时间换空间
4. 使用ThreadLocal创建变量副本,用空间换时间,无需考虑复杂的线程并发控制,但事实上这种做法应该是没有事实上的共享变量的,都是取一个可修改的副本而已。

总结

  1. 优先使用无状态bean及单例bean
  2. 如果需要考虑共享变量,才使用static关键字修饰创建有状态bean
  3. 对有状态bean,在并发使用中需考虑并发控制,如果需要确保所有对共享变量的操作都要共享则使用锁,若只是需要状态副本则使用ThreadLocal。

Spring中bean的单例与多例相关推荐

  1. Spring中bean标签的属性和值:

    Spring中bean标签的属性和值: <bean name="user" class="com.pojo.User" init-method=" ...

  2. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  3. Spring中bean的scop

    在Spring中bean对象的作用范围: 1:在默认情况下,Spring中管理的bean都是singleton的. 2:常用的scop: 1,singleton:单例,第一次创建之后,以后每次都拿这同 ...

  4. 面试题------Spring中Bean的初始化以及销毁init-method、destory-method

    面试题------Spring中Bean的生命周期 通过Spring工厂,可以控制bean的生命周期. 在xml中配置Bean的初始化和销毁方法 通过init-method属性指定初始化后的调用方法. ...

  5. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  6. Spring中Bean初始化和销毁的多种方式

    Spring中Bean初始化和销毁的多种方式 一.Bean的多种初始化方式 1.PostConstruct注解 2.实现InitializingBean接口 3.声明init-method方法 二.B ...

  7. Spring中bean的初始化和销毁几种实现方式详解

    关联博文:Spring中Bean的作用域与生命周期 Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – --- 销毁前操 ...

  8. 厉害了,Spring中bean的12种定义方法!

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  9. Spring 中 Bean 的生命周期

    本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...

最新文章

  1. centos6.5下载卸载mysql_Linux CentOS 6.5 卸载、tar安装MySQL
  2. 面试:说说你对 Java 中 final 的理解?
  3. python 数值的整数次方
  4. 了解ElasticSearch分析器
  5. 一道水的不能再水的题目
  6. 南方科技大学-计算智能与先进制造方向-博士-博士后-研究助理招聘
  7. csgo天津服务器维护怎么办,CSGO华北赛区在天津落下帷幕
  8. python数据分析要学多久_如何七周成为数据分析师18:Python的新手教程
  9. List.remove(i)报错:问题分析与解决
  10. linux常用运行库,软件常用运行库-软件常用运行库scku下载 v3.1.0.0官方版--pc6下载站...
  11. 公路多孔箱涵设计_多孔箱涵计算书
  12. 高级职称计算机考试要求考a级,全国职称计算机考试有哪些级别
  13. git lab提交记录中有 merge branch ‘xxx‘ of of http:xxx into xxx
  14. 电视android怎么连接手机助手下载,手机怎么连到电视上?
  15. Vue框架的初识入门
  16. 统计学习方法---李航
  17. Python实现用户输入国家名称,打印出所输入的国家名称和首都。
  18. Spring注解事务不支持 protect private 方法的原因
  19. Xpath语法和使用示例
  20. 何以解忧,唯有暴富,手把手教你打造财富方程式

热门文章

  1. 基于全景相机的视觉SLAM
  2. 【阴沟翻船】AVPlayer设置完毕马上调用play方法会导致播放没声音
  3. 想学3D建模,选对行业也很重要!这些热门行业的发展趋势你要知道
  4. 谷歌现金发电机如何复制17yr老小子谁赚10K人道
  5. 外贸软件日用工艺品行业解决方案
  6. 苹果设备收到家庭/日历垃圾邀请信息怎么办?
  7. [MATLAB] 初学入门 运用plot()函数绘制函数图像
  8. 下载的小说是PDF文件,不能导入到小说阅读器里怎么办?
  9. Midas GTS NX 的四面体模型转为 3DEC的模型 c++源码 (Tetrahedron to 3DEC)
  10. 道德文化水墨风景课件PPT模板