spring 生命周期回调后置处理器全流程
2019-12-20 13:45:13 0 举报
登录查看完整内容
本流程图介绍了spring框架生命周期回调流程,包括生命周期回调的八个后置处理器,通过流程图方式展现
作者其他创作
大纲/内容
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
获得bean实例前getBean操作
真正的创建bean方法,里面完成了八次调用后置处理器
空
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
第一次调用getSingleton
第二次调用后置处理器推断构造函数进行装配
第八次调用后置处理器,完成aop 动态代理获取代理后的对象
org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
spring 启动加载流程概述
Object sharedInstance = getSingleton(beanName)sharedInstance != null && args == null
是
第二次调用getSingleton,从容器中获取1、Object singletonObject = this.singletonObjects.get(beanName);跟之前的第一次调用获取单例对象一样 ,首先还是从map中去取,此处再次证明spring在容器初始化之后调用getBean其实就是从map中获取一个bean。 这里的场景假设在初始化A时第一次调用此方法,则返回对象空。2、beforeSingletonCreation(beanName) A对象名字添加到set集合中,singletonsCurrentlyInCreation.add(beanName)即把beanName放入 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.singletonsCurrentlyInCreation3、singletonObject = singletonFactory.getObject();这里便是创建一个bean的入口了 spring会首先实例化一个对象,然后走生命周期 ,走生命周期的时候前面说过会判断是否允许循环依赖 ,如果允许则会把创建出来的这个对象放到第二个map当中 ,然后接着走生命周期当他走到属性填充的时候 ,会去get一下B,因为需要填充B,也就是大家认为的自动注入 ,这些代码下文分析,如果走完了生命周期
获得bean方法 此时b对象尚未创建,为第二次调用getSingleton,从bean工厂中获取
扫描 scan
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy
第五次第六次调用后置处理器,完成属性填充
org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance
cglib动态代理
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
非空
org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
org.springframework.beans.factory.support.AbstractBeanFactory#createBean
throw new BeanCurrentlyInCreationException(beanName)
/第一次调用后置处理器,实例化对象之前获取代理对象如果使用了aop代理
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
第五、六次生命周期回调 属性填充
返回传入的bean
否
从缓存中获取bean
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)
再次调用, 此时b对象已创建
此次获取bean放入容器缓存中用于解决循环依赖
org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
完成bean 工厂初始化,此方法将执行spring bean 生命周期八次后置处理流程
第四次调用后置处理器,解决循环依赖引用问题
org.springframework.aop.framework.JdkDynamicAopProxy#getProxy(java.lang.ClassLoader)
org.springframework.beans.factory.support.AbstractBeanFactory#isPrototypeCurrentlyInCreation
jdk动态代理
实例是否在创建中prototypesCurrentlyInCreation.get().contains(beanName)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
获取bean工厂中的b对象,并放入容器缓存中,同时删除该对象bean工厂缓存
解析 parse
生命周期回调 lifecyle call back
if (mbd == null || !mbd.isSynthetic()) {
第七次 第八次 调用后置处理器 ,初始化代理后的对象
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
org.springframework.beans.factory.support.AbstractBeanFactory#prototypesCurrentlyInCreation
此处通过jdk动态代理或者是cglib动态代理实现,具体使用场景后续待补充
第七次调用后置处理器
完成第二次至第八次生命周期回调
校验 varify
判断是否需要代理
org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
java.lang.reflect.Proxy#newProxyInstance
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
org.springframework.context.support.AbstractApplicationContext#refresh
0 条评论
回复 删除
下一页