深究Spring中Bean的生命周期
Bean 的生命周期
如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步骤做文字描述:
-
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
-
Bean实例化后对将Bean的引入和值注入到Bean的属性中
-
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
-
如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
-
如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
-
如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
-
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
-
如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
-
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
-
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247488494&idx=1&sn=1ad8b2b4313b173b431a4e4943423f04&chksm=ebd62cc2dca1a5d4b434fe9913cc1ffbb42f61aac4d4364a38c8b15c1df524167336a2d4d6cb&mpshare=1&scene=1&srcid=0522WuGOqD3BIkRayLoe2MGH&key=e6cd5336efd7c7e0601f12856bb23a7e7ef17be935c3f5ff5f69e632443300546a0168e7d365ff1c82d1f07cc6afff50d91e1ba549c546d319c46a6ed3db6cda139d63f586e89c5822e2561237f1246a&ascene=0&uin=MTA2NzUxMDAyNQ%3D%3D&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F2511)&version=11020012&lang=zh_CN&pass_ticket=pqWfj2jRrkKHdG8mcEVs%2FStkC%2BINKOeu4sxf4P1CU16%2BKBVAx0MBSPcwbOu1i%2FhQ
实例化——设置属性——setcontext——initialize——use——destroy——finalize
如果你不指定bean的scope,singleton便是容器默认的scope.
singleton: 在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化之后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的“寿命”。
标记为singleton的bean是由容器来保证这种类型的bean在同一个容器中只存在一个共享实例;而Singleton模式则是保证在同一个Classloader中只存在一个这种类型的实例。
propertype: 针对声明为拥有prototype scope的bean定义,容器在接到该类型对象的请求的时候,会每次都重新生成一个新的对象实例给请求方。虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不再拥有当前返回对象的引用,请求方需要自己负责当前返回对象的后继生命周期的管理工作,包括该对象的销毁。
对于那些请求方不能共享使用的对象类型,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己对应的一个对象实例。通常,声明为prototype的scope的bean定义类型,都是一些有状态的,比如保存每个顾客信息的对象。
另外三种scope类型,即request、session和global session类型,只有在支持Web应用的ApplicationContext中才能使用这三个scope。
request: 为每一个HTTP请求创建一个全新的bean,当请求结束之后,该对象的生命周期即告结束。
session: 为每一个独立的session创建一个全新的bean对象,session结束之后,该bean对象的生命周期即告结束。
global session: global session只有应用在基于portlet的Web应用程序中才有意义,它映射到portlet的global范围的 session。如果在普通的基于servlet的Web应用中使用了这个类型的scope,容器会将其作为普通的session
类型的scope对待。
————————————————
版权声明:本文为CSDN博主「猪杂汤饭」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/programmer_at/article/details/82533396