Spring bean scope
更新日期:
BeanFactory除了拥有作为IoC Service Provider的职责,作为一个轻量级容器,它还有其它一些职责,其中就包括对象的生命周期管理。在容器中管理的对象的scope概念,大部分都会翻译成“作用域”这个名词。
scope用来声明容器中对象所应该出的限定场景或者说该对象的存活时间,即容器在对象进入相应的scope之前,生成并装配成对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。打个比方吧,我们都是处于社会(容器)中,如果把中学教师作为一类定义,那么当容器初始化这些类后,中学教师只能局限在中学这样的场景中;中学,就可以作为中学教师的scope。
singleton
配置中的bean定义可以看做是一个模板,容器会根据这个模块构造对象。但是要根据这个模板生成多少个对象实例,又该让着实例存活多久,则由容器根据bean定义的scope语意来决定。标记为拥有singleton scope的对象定义,在Spring的IoC容器中只存在一个实例,所有对该对象的引用都共享这个实例。该实例从容器启动,并因为第一次请求而初始化之后,将一直存活到容器退出。
从下图了解:
需要注意一点的事,不要以为名字的原因而与GoF所提出的Singleton模式相混淆,二者的语意是不同的:标记为Singleton的bean是有容器来保证这种类型的bean在同一个容器中只存在一个共享实例;而Singleton模式则是保证在同一Classloader中只存在一个这种类型的实例。可以以下两方面来了解singleton的bean所具有的特性。
- 对象实例数量 singleton类型的bean定义,在一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一实例。这就好像在每一个幼儿园都有一个滑梯一样,这个幼儿园的小朋友共同使用这个滑梯。而对该幼儿园容器来说,滑梯实际上就是一个singleton的bean.
- 对象存活时间 singleton类型的bean定义,从容器启动,到它第一次请求而被实例化开始,只要容器不销毁或者退出,该类型bean的单一实例就会一直存活。
prototype
针对声明为拥有prototype scope的bean定义,容器在接到该类型对象的请求时候,会每次都重新生成一个新的对象实例给对方。虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求之后,容器就不再拥有当前对象的引用,请求方需要自己负责当前返回对象的后继生命周期管理工作,包括对该对象的销毁。也就是说容器每次返回给请求方一个新的对象实例之后,就由这个对象实例“自生自灭”了。
声明为prototype类型的bean定义类型,都是有一些状态的,比如保存每个客户信息的对象。通过下图理解scrope的用法。