Spring中的IOC容器的实现原理

缘起

通过前面的章节,我们知道了如何搭建spring源码的阅读环境,本篇文章主要了解Spring的IOC容器是如何实现的。
下面直接开始

IOC容器

我们可以通过一个简单的main方法来调试应用

在这里插入图片描述
跟踪进ClassPathXmlApplicationContext源码可以看到
在这里插入图片描述
这里主要做了3件事

  1. 动态确定使用哪个加载器加载配置文件
  2. 获取配置文件的路径
  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就是我们所谓的容器。

发布了114 篇原创文章 · 获赞 146 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq32933432/article/details/95193334