Spring源码【一】:IOC容器的实现


Spring容器可以理解为水桶,里面bean就是水,水桶有普通水桶(beanFactory)、豪华水桶(ApplicationContext),水来自地下(文件),海(jar)甚至是冰(网络),Spring IOC就是一个装水的过程:

  1. 找水的过程(定位)

  2. 将不同形态的水统一处理成容器存放的水(加载)

  3. 将水装入水桶中(注册)

Spring源码【一】:IOC容器的实现

Spring源码【一】:IOC容器的实现
几点说明:

  • 在spring里面对资源的抽象都是Resource,但是来源不同即有不同的Resource,比如这里用的ClassPathResource(来自地下)。
    Spring源码【一】:IOC容器的实现

  • 这里用到的容器是DefaultListableBeanFactory

  • 那怎么把资源加载到这个容器中那?找一个打工仔(委托模式)XmlBeanDefinitionReader,完成不同形态的水的统一处理。

  • spring容器最终装的水就是beanDefinition。

后续源码学习全部通过以下案例:
Spring源码【一】:IOC容器的实现

定位

ClassPathXmlApplicationContext

Spring源码【一】:IOC容器的实现
调用子类AbstractApplicationContext的refresh方法
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
这里又调用了子类AbstractRefreshableApplicationContext的refreshBeanFactory方法:

Spring源码【一】:IOC容器的实现
重点看loadBeanDefinitions方法
Spring源码【一】:IOC容器的实现
这个又是一个需要子类继承的方法,所以这里子类AbstractXmlApplicationContext实现了loadBeanDefinitions方法
Spring源码【一】:IOC容器的实现
loadBeanDefinitions方法:从这里开始已经开始使用打工仔模式了,调用XmlBeanDefinitionReader的loadBeanDefinition方法
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
这里标黄色的是核心方法,是一个模板设计模式,用来让子类实现。

进入XmlBeanDefinitionReader的loadBeanDefinitions方法
Spring源码【一】:IOC容器的实现
这里非常重要的方法:doLoadBeanDefinitions方法
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现

进入BeanDefinitionDocumentReader的registerBeanDefinitions方法
Spring源码【一】:IOC容器的实现
Spring源码【一】:IOC容器的实现
这里又创建了打工仔BeanDefinitionParserDelegate,用作element解析bd
重点看parseBeanDefinitions方法:
Spring源码【一】:IOC容器的实现

加载

注册