Spring源码系列(二):refresh()方法详解之obtainFreshBeanFactory()方法

一、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()方法源码调试完毕。不足之处,敬请谅解!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容