1、在ioc容器启动时,通过invokeBeanFactoryPostProcessors加载所有的bean定义信息
2、在finishBeanFactoryInitialization对所有的单例bean进行创建
finishBeanFactoryInitialization
preInstantiateSingletons()
//循环所有bean定义,如果满足!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit() 则 进行创建
getBean(String name)
doGetBean(name, null, null, false)
1、getSingleton(beanName)//从3级缓存中取
//如果步骤一中有,就判断是否为FactoryBean。是则调用factory.getObject(),
否,就返回bean。
2、getObjectForBeanInstance
//如果步骤1中没有,就创建
3、getSingleton(beanName, () -> {...createBean(beanName, mbd, args)...});
1、beforeSingletonCreation(beanName);//标记正在创建该bean
2、createBean(beanName, mbd, args)
//执行InstantiationAwareBeanPostProcessor,缓存代理类advisor
resolveBeforeInstantiation(beanName, mbdToUse);
doCreateBean(beanName, mbdToUse, args);
// 推断构造方法获取原始对象
1、createBeanInstance(beanName, mbd, args);
2、addSingletonFactory //放入第3级缓存,暴露原始对象
3、 populateBean(beanName, mbd, ...);//属性注入
//执行BeanPostProcessor,判断是否需要创建代理对象
4、initializeBean(beanName, exposedObject, mbd);
3、afterSingletonCreation(beanName);//移除正在创建
4、addSingleton(beanName, singletonObject); //放入第1缓存
截图保存,以免样式错乱