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