先从上图红点debug进入代码
configLoacations 指的是你的资源文件位置,此处指的就是classPath下的applicationContext.xml
refresh默认为true, parent我们没传为空。我们顺便来看看classPathxmlApplicationContext的继承关系
setConfiglocations是classPathXmlApplicationContext 调用父类AbstractRefreshableConfigApplicationContext的方法初始化自己的configurations.
接下来进入AbstractApplicationContext(抽象类)的refresh方法
今天我们主要看的就是spring如何初始化beanfactory的,红色区域已经标记出,进入obtainFreshBeanFactory这个方法
图四
obtainFreshBeanFactory这个方法里面主要有2个步骤,第一个步骤537行的refreshBeanFactory(),
图五
122~125行表示如果已经有了一个容器,先销毁里面的bean然后再关闭容器,spring保证只有一个容器,然后我们看131~133行,在线程安全的状态下,为this.beanfactory赋值,那么this.beanfactory是什么呢,就是图一中红旗①标记的DefaultListableBeanFactory beanFactory,现在调用方法的顺序也如图一中用①②③这种标记已经标出,refreshBeanFactory()这个方法的最终目的就是为AbstractRefreshableApplicationContext.java中DefaultListableBeanFactory beanFactory赋值,那么127~130行就是为beanFactory初始化这个容器里面的各个组件了,我们先暂时不分析127~130行代码,回到图四中538行代码,getBeanFactory(),打开getBeanFactory()
在线程安全的情况下,返回this.beanFactory,这个beanFactory是谁呢,原来就是刚刚refreshBeanFactory()方法赋值的那个AbstractRefreshableApplicationContext.java中的DefaultListableBeanFactory beanFactory,现在一切都顺理成章了,beanfactory就是这么初始化好的,然后返回的
本质就是给AbstractRefreshableApplicationContext的beanfactory赋值 线程安全地赋值。
接下来我们看看xmlBeanDefinitionReader