-
通过之前的“Spring IOC容器初始化主体流程”中的关健节点分析,我们知道Bean创建子流程入口在AbstractApplicationContext#refresh()中的
finishBeanFactoryInitialization(beanFactory)处。
- 进入了finishBeanFactoryInitialization
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// Allow for caching all bean definition metadata, not expecting further changes.
beanFactory.freezeConfiguration();
// Instantiate all remaining (non-lazy-init) singletons.
// 实例化所有立即加载的单例bean
beanFactory.preInstantiateSingletons();
-
继续进⼊DefaultListableBeanFactory类的preInstantiateSingletons⽅法,我们找到下⾯部分的代码,看到⼯⼚Bean或者普通Bean,最终都是通过getBean的⽅法获取实例
-
继续跟踪下去,我们进⼊到了AbstractBeanFactory类的doGetBean⽅法,这个⽅法中的代码很多,我们直接找到核⼼部分
-
接着进⼊到AbstractAutowireCapableBeanFactory类的⽅法,找到以下代码部分
- 进⼊doCreateBean⽅法看看,该⽅法我们关注两块重点区域
-
创建Bean实例,此时未设置属性
-
给Bean填充属性,调用初始化方法,应用BeanPostProcessor后置处理器
-