spring bean的执行流程
2020-06-08 09:51:18 7 举报
spring源码分析Bean的执行流程图详解
作者其他创作
大纲/内容
AbstractAutowireCapableBeanFactory
校验当前的bean定义,若当前的bean定义是abstract的话直接抛出异常
beforeSingletonCreation(beanName);
标识并判断当前对象是否正在创建,对象放入到一个标识singletonsCurrentlyInCreation对象中。
把刚刚创建好的对象 属性还没有赋值的对象通过ObjectFactory的形式加入到缓存中,用来解决循环依赖。
getObjectForBeanInstance
把我们的早期对象放入缓存中,用户解决循环依赖。注:什么叫做早期对象(还没有给我的属性进行赋值)。
parentBeanFactory !=null
1)如果是@Bean的形式的,那么通过instantiateUsingFactoryMethod 来进行调用创建对象。2)通过@Autowired 标注在我的构造方法上就通autowireConstructor 来进行反射调用3)通过普通的包扫描的形式 那么就调用我们模式的构造方法进行反射创建对象。
N
instantiateBean
containsBeanDefinition(beanName)
把创建好的bean实例加入到我们的缓存池,情况二三级缓存。
resolveBeforeInstantiation
getMergedLocalBeanDefinition(beanName)
判断
调用后置处理器的affer方法
instantiateUsingFactoryMethod
initalizeBean在这里增强
通过工厂
doGetBean
真正的创建Bean的逻辑
refresh()
通过ObjeccFacotry.getObject()方法触发createBean的流程。
autowireConstructor
真正开始的地方AbsrtactBeanFactory
备注
进行初始化
singletonObject = singletonFactory.getObject();
afterSingletonCreation(beanName);
有参,在构造函数上标识了@Autowired的注入方法 调用构造方法来创建
注:这里的逻辑分支就是当前容器有父容器,并且当前容器不包含当前Bean定义,那么就会走父容器创建Bean的流程。
去父容器拿
Y
直接返回bean
checkMergedBeanDefinition通过模板类检查
判断父工厂是否为空
给我们的属性进行赋值
只会走一种
调用无参的构造器来创建对象举例:相当于在类上@Service等
(singletonObject == null)
通过别名transformedBeanName
finishBeanFactoryInitialization(beanFactory)
调用后置处理器 用来处理创建代理对象的,但是 ,我们代理对象不再这里创建(因为我们的对象还没有进行实例化)把我们的切面和通知(增强器)进行缓存下来。
earlySingletonExposure=true
根据bean定义来创建bean,即isSingleton,或isPrototype
doCreateBean
getParentBeanFactory()
bean !=null
#getBean
而且当前容器不包含当前创建bean定义
#createBean
通过工厂方法来创建Bean实例 @Bean的形式配置的。
从单例缓存池里拿bean=getSingleton
invokeInitMeshods
addSingletonFactory
当前的bean已经创建好了 把当前的bean给从singletonsCurrentlyInCreation移除掉。
直接返回Bean
0 条评论
回复 删除
下一页