欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring生命周期详解

程序员文章站 2023-02-21 15:42:53
导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在 方法中,下面也是围绕其中的逻辑进行讲解。 开撸 【1】 prepareRefresh() 内部其实很简单,就是设置一些标志,比如开始时间,激活的状态等。 【2】prepareBeanFactory(beanFactory ......

导读

  • 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):调用beannameawarebeanclassloaderawarebeanfactoryaware中的对应方法

​ g. wrappedbean = applybeanpostprocessorsbeforeinitialization(wrappedbean, beanname):调用beanpostprocessord中的postprocessbeforeinitialization方法

​ h. invokeinitmethods(beanname, wrappedbean, mbd):执行initializingbean中的afterpropertiesset

​ i. wrappedbean = applybeanpostprocessorsafterinitialization(wrappedbean, beanname):调用beanpostprocessor中的postprocessafterinitialization方法

总结

以上是spring容器从启动到销毁的全部过程,根据源码陈某画了一张生命周期的图,仅供参考,请勿转载!!!

Spring生命周期详解

  • 如果觉得作者写的好,有所收获的话,点个关注推荐一下哟!!!
    Spring生命周期详解