缘起
通过前面的章节,我们知道了如何搭建spring源码的阅读环境,本篇文章主要了解Spring的IOC容器是如何实现的。
下面直接开始
IOC容器
我们可以通过一个简单的main方法来调试应用
跟踪进ClassPathXmlApplicationContext源码可以看到
这里主要做了3件事
- 动态确定使用哪个加载器加载配置文件
- 获取配置文件的路径
- 加载配置文件
我们直接看refresh()
看528行的obtainFreshBeanFactory()方法
看refreshBeanFactory();方法
看137行loadBeanDefinitions(beanFactory);方法
看100行loadBeanDefinitions(beanDefinitionReader);
看137行loadBeanDefinitions(configLocations);方法,该方法里面还会调用loadBeanDefinitions好几次,我们一直跟踪到最里面可以看到
看338行doLoadBeanDefinitions方法
看403行的doLoadDocument(inputSource, resource);,看到Document,我们应该能猜到终于到了解析xml这一步了,里面的怎么解析的,先按下不表。我们只需要这里会把我们的配置文件解析为document对象,
我们先看registerBeanDefinitions(doc, resource);注册
通过这里可以很清晰的看到spring在解析xml的时候会判断我们的节点是import节点,或者是Bean节点等其他节点,我们先看Bean节点
这里就是最终的注册了,会把我们的Bean放入到一个map中,其中key为我们在xml中定义的id,或者name,如果我们没定义的话,beanName就是如下这样的。value为一个BeanDefinition对象
总结
到此我们明白了,所谓的IOC,其实就是把我们的类打包成一个BeanDefinition对象,该对象里面会包含我们的类Class名称,以及我们在xml中定义的scope,还要这个类的属性等信息。然后把这个BeanDefinition对象put到Map中,这个Map就是我们所谓的容器。