来看一下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方法。