Spring的单例bean与原型bean的区别和创建过程

Posted weixin_42412601

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring的单例bean与原型bean的区别和创建过程相关的知识,希望对你有一定的参考价值。

1、Spring官方文档中给出的bean的scope有五种

  • singleton
  • prototype
  • request
  • session
  • global session

实际上,Spring最基本的scope只有两种,即singleton和prototype。
可以参看spring源码中的BeanDefinition.java的定义,只有这两种:

String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

其他的各种scope都是自行扩展出来的。包括官网文档中没有列出来的 servletContenxt 、thread;SpringCloud提供的refresh等。
其继承关系大致如下:

2、singletonScope与prototypeScope

  • singletonScope,即单例Bean,顾名思义具有单例模式的所有特性,在spring容器里面只会初始化出一个bean实例,存于缓存中。后续的请求都公用这个对象。
    最简单的创建单例bean的方式,就是直接在类名上面加@Service注解。
  • prototypeScope,即原型Bean,每次请求时都会创建新的bean实例直接使用。
    创建原型Bean,需要显示指定scope属性。

3、两种bean的创建过程

可以参看spring的 AbstractBeanFactory.java 中的 doGetBean 方法,理解两种bean的使用过程。

单例bean的创建:


单例bean被存放在三级缓存中的一个Map中:

/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);

上面代码中的 getSingleton 方法,作用就是先根据beanName从缓存map(singletonObjects)中取bean,

取不到的话,调用后面的singletonFactory的createBean方法创建单例bean(这里的createBean是抽象方法,具体实现交给了各种scope的实现类负责),创建成功以后,存入singletonObjects,并将引用返回。

原型bean的创建:


中规中矩,上来就直接创建,然后分befoew、createBean、after三个生命周期,对于具体实现提供充分的支持。

至于最后一句 getObjectForBeanInstance,如果上面创建的是一个普通bean则直接返回;如果创建的是一个BeanFactory的实例,则利用工厂实例创建新的bean,然后返回。

对于其他扩展出来的scope
会利用 接口 Scope.java 中定义的这个方法,调用各扩展scope的实现去创建bean:

// Return the object with the given name from the underlying scope,
Object get(String name, ObjectFactory<?> objectFactory);

以上是关于Spring的单例bean与原型bean的区别和创建过程的主要内容,如果未能解决你的问题,请参考以下文章

在Spring上下文中的原型bean中的单例bean

Spring源码分析原型Bean实例化过程byName与byType及FactoryBean获取Bean源码实现

spring bean的作用域之间有啥区别

java开发 从哪些地方可以看出来spring使用的单例模式?

在 Spring 中将原型列表注入 Singleton bean

spring中创建bean对象时多例和单例的区别