spring源码分析——bean的作用域

  

  来看一下spring维护实例bean的作用域,之前我们一直分析的是singleton单例bean,下面我们来看一下prototype类型的

一:prototype类型

准备一个类TestA,设置作用域Scope为prototype类型

测试代码,对于testA,getBean两次,看一下是否是同一个对象,

 通过运行结果可以看出,scope为prototype实例化,会获取不同的对象

如果我们把prototype去掉会怎样呢?

默认为singleton类型,获取两次是同一个对象

下面我们从源码层面来分析一下prototype

prototype类型bean的创建很简单,只是不缓存bean对象,每次创建完成后直接返回对象 ,所以如果prototype类型的对象互相依赖,会抛异常

因为它没有三级缓存存在。

二:其他类型,request类型或者session类型

默认SimpleThreadScope类型的作用域在Thread内部,如果是一次请求,会分配一个线程处理,实例的作用域就在一次请求内。

总结:

  singleton类型:作用域全局共享,对象创建完成后,会放入缓存

  prototype类型:每次getBean都会创建新的对象,对象创建完成后不缓存

  其他类型,例如request,作用域在一次请求内部,使用ThreadLocal隔离

也可以自定义作用域,实现Scope接口,重写get方法。

原文地址:https://www.cnblogs.com/warrior4236/p/13236859.html