Spring生命周期详解
导读
- spring中bean的生命周期从容器的启动到停止,涉及到的源码主要是在
org.springframework.context.support.abstractapplicationcontext.refresh
方法中,下面也是围绕其中的逻辑进行讲解。
开撸
【1】 preparerefresh()
内部其实很简单,就是设置一些标志,比如开始时间,激活的状态等。
【2】preparebeanfactory(beanfactory)
做一些简单的准备工作,此处不再赘述!!!
【3】postprocessbeanfactory(beanfactory)
主要的作用就是添加了一个后置处理器servletcontextawareprocessor
【4】invokebeanfactorypostprocessors(beanfactory)
调用容器中的所有的beanfactorypostprocessor中的postprocessbeanfactory方法,按照优先级调用,主要实现逻辑在org.springframework.context.support.postprocessorregistrationdelegate.invokebeanfactorypostprocessors(org.springframework.beans.factory.config.configurablelistablebeanfactory, java.util.list<org.springframework.beans.factory.config.beanfactorypostprocessor>)
(1) 执行所有beandefinitionregistrypostprocessor(对beanfactorypostprocessor的扩展,运行在普通的实现类之前注册bean)的方法,同样是内部按照优先级进行排序调用
(2) 对剩余的进行按照优先级排序调用,同样是内部进行排序执行
【5】registerbeanpostprocessors(beanfactory)
注册所有的beanpostprocessor(后置处理器),按照优先级注册,分别是priorityordered,ordered,普通的,内部的。主要的实现逻辑在postprocessorregistrationdelegate.registerbeanpostprocessors()
【6】initmessagesource()
注册messagesource,提供消息国际化等功能
【7】initapplicationeventmulticaster();
注册事件广播器applicationeventmulticaster,用于spring事件的广播和事件监听器的处理
【8】registerlisteners()
注册事件监听器applicationlistener,并且广播一些早期的事件,主要的逻辑在org.springframework.context.support.abstractapplicationcontext.registerlisteners
【9】finishbeanfactoryinitialization(beanfactory)
实例化所有非懒加载的bean,spring生命周期中的主要方法,主要逻辑在org.springframework.beans.factory.support.defaultlistablebeanfactory.preinstantiatesingletons,深入进去其实就是getbean()方法创建,详情向下看。
【10】finishrefresh()
主要的功能是发布事件contextrefreshedevent
【11】destroybeans()
容器启动出现异常时销毁bean
以上就是spring容器启动的过程,主要的逻辑都在org.springframework.context.support.abstractapplicationcontext#refresh中,其他的都很容易理解,现在我们着重分析一下单例bean的创建过程,入口是第9步。
实例化单例bean
【1】debug进入,实际主要的逻辑都在org.springframework.beans.factory.support.defaultlistablebeanfactory#preinstantiatesingletons方法中,逻辑如下:
//获取所有注入到ioc容器中的bean定义信息 list<string> beannames = new arraylist<>(this.beandefinitionnames); //循环创建 for (string beanname : beannames) { rootbeandefinition bd = getmergedlocalbeandefinition(beanname); //非抽象,单例,非懒加载的bean初始化 if (!bd.isabstract() && bd.issingleton() && !bd.islazyinit()) { //如果是factorybean if (isfactorybean(beanname)) { //getbean object bean = getbean(factory_bean_prefix + beanname); //非factorybean,getbean else { getbean(beanname); } } }
以上源码总结得知,最终实例化bean的方法肯定在getbean中的,debug进入,得知dogetbean是大boss,spring源码有趣的是最终的实现都是在doxxxx()。
【2】abstractbeanfactory#dogetbean,由于篇幅太短,就不贴源码了,只贴关键代码
实例化的主要流程全部都在这里,下面一一解析即可。
(1) object sharedinstance = getsingleton(beanname)
从早期的缓存中获取,如果存在返回bean,实例化
(2)beanfactory parentbeanfactory = getparentbeanfactory()
从父工厂的中获取bean
(3)if (mbd.issingleton())
分单例和多例进行分开创建bean,这里只分析单例bean的创建
(4)sharedinstance = getsingleton(beanname, () -> { try { return createbean(beanname, mbd, args); }
createbean方法创建bean,进入createbean()
a. object bean = resolvebeforeinstantiation(beanname, mbdtouse):执行所有的instantiationawarebeanpostprocessor中的postprocessbeforeinstantiation,在实例化之前调用,返回null继续下一步,返回一个bean,那么bean实例化完成,将调用其中的postprocessafterinstantiation方法
b. object beaninstance = docreatebean(beanname, mbdtouse, args):创建bean的完成过程
c. 进入docreatebean,instancewrapper = createbeaninstance(beanname, mbd, args):创建bean的实例
d. populatebean(beanname, mbd, instancewrapper):属性装配,执行instantiationawarebeanpostprocessor的postprocessafterinstantiation,再执行postprocessproperties方法。
e. exposedobject = initializebean(beanname, exposedobject, mbd):初始化bean,debug进入
f. invokeawaremethods(beanname, bean):调用beannameaware,beanclassloaderaware,beanfactoryaware中的对应方法
g. wrappedbean = applybeanpostprocessorsbeforeinitialization(wrappedbean, beanname):调用beanpostprocessord中的postprocessbeforeinitialization方法
h. invokeinitmethods(beanname, wrappedbean, mbd):执行initializingbean中的afterpropertiesset
i. wrappedbean = applybeanpostprocessorsafterinitialization(wrappedbean, beanname):调用beanpostprocessor中的postprocessafterinitialization方法
总结
以上是spring容器从启动到销毁的全部过程,根据源码陈某画了一张生命周期的图,仅供参考,请勿转载!!!
- 如果觉得作者写的好,有所收获的话,点个关注推荐一下哟!!!