getBean流程(简化版)
2021-03-25 10:48:47 12 举报
getBean流程(简版)
作者其他创作
大纲/内容
根据Bean定义的scope来创建Bean
通过ObjeccFacotry.getObject()方法触发createBean的流程
getMergedLocalBeanDefinition(beanName);
doGetBean
第一步:回调XXXAware接口
afterSingletonCreation();
(而且当前容器不包含当前创建bean定义)
getObjectForBeanInstance
第二步:调用所有后置处理器的before前置方法
直接返回bean
AbstractAutowireCapableBeanFactory#createBean
(判断父工厂是否为空)
创建Bean的流程
N
addSingleton();
autowireConstructor();
备注
当前的bean已经创建好了 把当前的bean给从singletonsCurrentlyInCreation移除掉
真正的创建Bean的逻辑
parentBeanFactory!=null
把刚刚创建好的对象 属性还没有赋值的对象通过ObjectFactory的形式加入到缓存中,用来解决循环依赖
Y
(获取父工厂)
AbstractBeanFactory#getBean
就是在这里给后置处理器一个机会来返回代理对象,但是在这里并没有创建代理对象,仅仅是把切面信息解析出来缓存好
getObjectForBeanInstance();
instantiateBean();
bean!=null
把创建好的对象放进到缓存池,清空二三级缓存
(在构造函数上标识了@Autowired的注入方法 调用构造方法来创建)
校验当前的bean定义,若当前的bean定义是abstract的话直接抛出异常
bean=getSingleton
(通过工厂方法来创建Bean实例 @Bean的形式配置的)
singletonObject = singletonFactory.getObject();
beforeSingletonCreation();
transformedBeanName
(调用无参的构造器来创建对象)
getParentBeanFactory()
resolveBeforeInstantiation();
checkMergedBeanDefinition();
addSingletonFactory();
标识当前创建对象放入到一个标识singletonsCurrentlyInCreation对象中
createBeanInstance();
instantiateUsingFactoryMethod();
doCreateBean();
initializeBean();
containsBeanDefinition(beanName)
getBean完整流程(简版)
第三步:invokeInitMethods();
populateBean();
给创建对象的属性赋值
font color=\"#ff0000\
第四步:调用所有后置处理器的after后置方法
去缓存中获取对象(三级缓存)singletonObjects 单例缓存池,用于保存创建完成的对象font color=\"#ff0000\
0 条评论
下一页