一、refresh()方法之obtainFreshBeanFactory()方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
二、obtainFreshBeanFactory()方法详解
点击进入obtainFreshBeanFactory()方法:
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
return getBeanFactory();
}
接下来,我们来调试refreshBeanFactory方法:
image.png
createBeanFactory()方法,这里创建了默认的BeanFactory:DefaultListableBeanFactory。
protected DefaultListableBeanFactory createBeanFactory() {
return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}
然后,我们继续来看loadBeanDefinitions(beanFactory)方法:
image.png
然后,获取所有的xml配置文件:
image.png
循环遍历,获取每一个xml文件的beanDefinitions:
image.png
image.png
image.png
image.png
image.png
到此,开始从resource读取输入流:
image.png
doLoadBeanDefinitions真正干活的方法。在Spring中,do开头的方法才是真正干活的方法。从输入流获取Document:
image.png
然后,执行注册BeanDefinitions:
image.png
同样地,有个doRegisterBeanDefinitions作为真正的干活的方法:
image.png
准备解析Document对象信息:
image.png
具体地解析子节点信息:
image.png
解析bean信息。可以看到,这时候正好是读取的第一个bean的信息Teacher,我们继续调试:
image.png
image.png
获取beanName,注册beanDefinition:
image.png
开始尝试从beanDefinitionMap获取当前bean对象teacher,此时应该从容器里获取不到teacher beanDefinition信息的。
image.png
这个步骤的操作是:向beanDefinitionMap中放入teacher的beanDefinition定义信息,同时,向beanDefinitionNames中添加beanName,即teacher。
image.png
这里,我们也看下beanDefinition信息:
image.png
最后,就是注册别名信息:
image.png
这里是移除已经加载进来的encodedResource的对象信息:
image.png
refreshBeanFactory()方法之后,执行getBeanFactory()方法:
image.png
三、调用栈信息
image.png
四、总结
至此,obtainFreshBeanFactory()方法源码调试完毕。不足之处,敬请谅解!!!